Laravel怎么上传图片到阿里云OSS_Laravel集成对象存储方案【教程】

3次阅读

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

Laravel怎么上传图片到阿里云OSS_Laravel集成对象存储方案【教程】

直接用 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: OvertrueFlysystemOssAdapterArgumentCountError 构造函数参数不匹配

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

text=ZqhQzanResources