You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 13:18:04