Laravel Nova对接DigitalOcean Spaces上传公开图片权限异常如何解决
解决方案
1. 修正存储磁盘配置
DigitalOcean Spaces 兼容S3驱动时要求显式指定公开访问权限参数,你需要先修改config/filesystems.php中spaces磁盘的配置,新增visibility和ACL参数:
// config/filesystems.php 'disks' => [ // 其他现有磁盘配置 'spaces' => [ 'driver' => 's3', 'key' => env('DO_SPACES_KEY'), 'secret' => env('DO_SPACES_SECRET'), 'region' => env('DO_SPACES_REGION'), 'bucket' => env('DO_SPACES_BUCKET'), 'endpoint' => env('DO_SPACES_ENDPOINT'), 'url' => env('DO_SPACES_URL'), // 新增以下两行配置 'visibility' => 'public', 'options' => [ 'ACL' => 'public-read' ], ], ]
2. 修正PublicUpload类的调用参数
你原有的代码中调用storePublicly时没有传入指定的spaces磁盘参数,会默认使用Laravel默认的public磁盘执行上传,导致权限配置不生效,修改代码如下:
<?php namespace App\Nova; use Illuminate\Http\Request; class PublicUpload { public function __invoke(Request $request, $model, $attribute, $requestAttribute, $disk, $storagePath) { $currentFile = $request->file($attribute); // 显式传入$disk参数,指定使用spaces磁盘执行公开上传 return [ $attribute => $currentFile->storePublicly($storagePath, $disk) ]; } }
3. 备用兼容方案
如果上述配置仍未生效,可以直接通过磁盘实例操作上传,显式指定公开权限:
public function __invoke(Request $request, $model, $attribute, $requestAttribute, $disk, $storagePath) { $currentFile = $request->file($attribute); // 直接调用磁盘实例的putFile方法,第三个参数指定权限为public $savedPath = $disk->putFile($storagePath, $currentFile, 'public'); return [ $attribute => $savedPath ]; }
验证方式
上传文件后到DigitalOcean Spaces控制台查看对应文件的权限,确认显示为公开,直接访问文件URL可正常加载后,Nova的Image字段预览即可正常显示。
内容的提问来源于stack exchange,提问作者Joe Spurling
相关产品推荐
相关产品推荐

