使用 Laravel Flysystem 上传图片到阿里云 OSS 需安装 overtrue/flysystem-oss 适配器、在 filesystems.php 中正确配置 oss 磁盘(含 endpoint、bucket 等参数)、上传时设置 visibility=public 并推荐使用 putFile() 方法。

直接用 Laravel 的 Flysystem 驱动就能上传图片到阿里云 OSS,不需要手写 HTTP 请求或调用 SDK —— 关键是装对包、配对驱动、选对磁盘名。
确认已安装 oss:// 官方 Flysystem 适配器
Laravel 本身不内置 OSS 支持,必须通过 overtrue/flysystem-oss 提供的适配器。Laravel 9+ 默认使用 Flysystem 3.x,要对应装兼容版本:
-
composer require "overtrue/flysystem-oss:^4.0"(适配 Flysystem 3.x) - 如果项目还在用 Flysystem 2.x(如 Laravel 8),则装
^3.0 - 装错版本会导致
Class not found: Overtrue\Flysystem\OssAdapter或ArgumentCountError构造函数参数不匹配
在 config/filesystems.php 中注册 OSS 磁盘
别只改 .env,OSS 驱动必须显式声明为 oss 类型,并传入正确构造参数:
'oss' => [
'driver' => 'oss',
'access_key' => env('ALIYUN_OSS_ACCESS_KEY_ID'),
'secret_key' => env('ALIYUN_OSS_ACCESS_KEY_SECRET'),
'endpoint' => env('ALIYUN_OSS_ENDPOINT'), // 注意:不是 bucket 域名,是 Region Endpoint,如 https://oss-cn-hangzhou.aliyuncs.com
'bucket' => env('ALIYUN_OSS_BUCKET'),
'cdn_domain' => env('ALIYUN_OSS_CDN_DOMAIN', null), // 可选,用于生成带 CDN 的 URL
'ssl' => true,
'debug' => false,
],
-
endpoint错写成 bucket 域名(如https://my-bucket.oss-cn-hangzhou.aliyuncs.com)会导致连接超时或InvalidEndpoint - 若用内网访问 ECS 同地域 OSS,可把
endpoint换成内网地址(如https://oss-cn-hangzhou-internal.aliyuncs.com),节省流量且更快 -
cdn_domain设了之后,Storage::disk('oss')->url('xxx.jpg')才会返回 CDN 地址而非 OSS 原始地址
上传图片时注意路径、可见性与文件名处理
用 Storage::disk('oss') 上传即可,但几个细节决定是否能正常访问:
- OSS 默认上传文件为私有(private),如需公开访问,必须显式设
'visibility' => 'public',否则url()返回预签名链接(带临时 token),过期即失效 - 推荐用
putFile()或putFileAs(),自动处理 MIME 类型和路径编码;避免直接用put()传原始二进制流,容易丢掉Content-Type - 文件名建议加时间戳或 UUID,防止重名覆盖:
Storage::disk('oss')->putFile('uploads/images', $request->file('image')) - 上传后可用
Storage::disk('oss')->exists($path)快速验证是否成功,比查日志快得多
OSS 不支持目录删除(rmdir)、递归列出(listContents 深度有限)、或原子性 rename,这些操作在本地开发时可能“看起来正常”,上线后会出问题。真正要用到批量管理或复杂路径逻辑,得绕过 Flysystem 直接调 aliyuncs/oss-sdk-php。










