You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Laravel Cloud部署的Laravel项目文件上传后访问出现404错误求助

Laravel Cloud部署的Laravel项目文件上传后访问出现404错误求助

嘿,我看了你的问题,核心症结在于你当前的代码仍在把文件存在服务器本地的storage/app目录里,但Laravel Cloud的Bucket是独立的对象存储服务,和服务器本地存储完全分离,所以访问时自然会出现404。你虽然在filesystems.php里配置了s3磁盘,但既没切换默认存储磁盘,也没在上传时指定使用Bucket存储,才导致了这个问题。下面给你一步步的解决办法:

1. 配置Laravel Cloud Bucket的环境变量

首先得让Laravel知道要使用兼容S3协议的Bucket作为存储介质。去Laravel Cloud控制台找到你的Bucket详情页,把对应的配置信息复制到项目的.env文件中:

# 将默认存储磁盘切换为s3
FILESYSTEM_DISK=s3

# 以下信息从Laravel Cloud Bucket详情页复制
AWS_ACCESS_KEY_ID=你的Bucket访问密钥ID
AWS_SECRET_ACCESS_KEY=你的Bucket访问密钥
AWS_DEFAULT_REGION=你的Bucket所属区域(比如us-east-1,控制台会显示)
AWS_BUCKET=你的Bucket名称
AWS_URL=你的Bucket公开访问域名(比如https://xxx.laravelcloudstorage.com,控制台会提供)

2. 修改文件上传代码,指定使用Bucket存储

你当前的store()方法没有指定存储磁盘,默认会用local磁盘存在服务器本地。需要修改上传代码,明确指向s3磁盘(也就是你的Laravel Cloud Bucket):

单文件上传(press_book)

把原来的代码:

$pressBookPath = $request->file('press_book')->store('applications/press_books');

替换为:

// 明确指定s3磁盘,并设置文件为公共可读(后台需要下载必须公开)
$pressBookPath = $request->file('press_book')->store(
    'applications/press_books',
    [
        'disk' => 's3',
        'visibility' => 'public',
    ]
);

多文件上传(mp3s)

循环中的上传代码也要同步修改:

foreach ($request->file('mp3s') as $mp3File) {
    $mp3Paths[] = $mp3File->store(
        'applications/mp3s',
        [
            'disk' => 's3',
            'visibility' => 'public',
        ]
    );
}

小贴士:如果你已经把FILESYSTEM_DISK改成s3了,其实可以省略'disk' => 's3'参数,但明确指定能让代码可读性更高,也避免后续改默认磁盘时出问题。

3. 修复后台文件下载的访问方式

之前本地存储时你可能用asset('storage/'.$path)这类方式生成链接,但现在文件在Bucket里,必须用Laravel的Storage门面生成正确的公开访问URL:

比如在后台生成下载链接时,要这样写:

// 生成press_book的下载链接
Storage::disk('s3')->url($artistApplication->press_book_path);

// 循环生成mp3文件的下载链接
foreach (json_decode($artistApplication->mp3_paths) as $mp3Path) {
    echo '<a href="'.Storage::disk('s3')->url($mp3Path).'" target="_blank">下载MP3</a>';
}

4. 额外检查项

  • 迁移已有文件:如果你之前在本地存储过文件,需要手动把它们上传到Laravel Cloud Bucket的对应目录(applications/press_booksapplications/mp3s),这样后台的旧数据也能正常访问。
  • CORS规则配置:如果后台是通过前端直接访问Bucket文件,要确保Laravel Cloud Bucket的CORS规则允许你的域名访问(控制台的Bucket设置里可以配置)。
  • 验证密钥权限:确认你配置的AWS密钥具备Bucket的读写权限,Laravel Cloud生成的默认密钥是有权限的,但如果自行修改过要重新检查。

最后测试一下:提交一个新的申请,然后去Laravel Cloud Bucket里确认文件是否已上传,再用后台的下载链接访问,应该就不会出现404了。如果还有问题可以随时问我!

火山引擎 最新活动