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_books和applications/mp3s),这样后台的旧数据也能正常访问。 - CORS规则配置:如果后台是通过前端直接访问Bucket文件,要确保Laravel Cloud Bucket的CORS规则允许你的域名访问(控制台的Bucket设置里可以配置)。
- 验证密钥权限:确认你配置的AWS密钥具备Bucket的读写权限,Laravel Cloud生成的默认密钥是有权限的,但如果自行修改过要重新检查。
最后测试一下:提交一个新的申请,然后去Laravel Cloud Bucket里确认文件是否已上传,再用后台的下载链接访问,应该就不会出现404了。如果还有问题可以随时问我!




