首页 > 解决方案 > 如何在 Laravel Vapor 中从 S3 检索文件

问题描述

使用 Laravel Vapor 成功存储图像后,我在 html 中动态加载图像时遇到问题。

我已经按照laravel vapor 提供的这个文档来存储文件,它就像一个魅力。我将上传的文件从 tmp 目录复制到我的 S3 存储桶的根目录中,然后将该文件的路径存储在我的数据库图像表中,以便稍后我可以将文件路径返回到我的前端并在我的浏览器中显示图像。

不幸的是,这总是从 AWS S3 返回 403 状态代码。

我可以通过公开生成的 S3 存储桶来解决此问题,但这会引发安全问题。我相信这应该开箱即用,不知道我可能哪里出错了......有什么想法吗?

我正在使用 Storage 门面返回上传的图像 url。

use Illuminate\Support\Facades\Storage;    

return Storage::url($image->path);

$image->path我的 S3 存储桶中的文件路径在哪里。

我确信存储外观工作正常,因为它返回了带有文件路径的正确 url。

标签: laravelamazon-s3laravel-vapor

解决方案


我得到了这个问题的解决方案。我联系了 laravel vapor 支持,并被告知在我将文件复制到永久位置时将其可见性属性设置为公开,如 Laravel 的官方文档中所述

因此,在使用 js vapor.store 方法上传文件后,您应该将其复制到永久目录,然后将其可见性设置为公开。

Storage::copy($request->path, str_replace('tmp/', '', $request->path));
Storage::setVisibility(str_replace('tmp/', '', $request->path), 'public');

我还注意到,您可以通过传递具有相应值的可见性属性直接在 vapor.store 方法中设置文件的可见性。

vapor.store(file, { visibility: 'public-read' });

附带说明:只有“public”会返回 400 错误请求,它必须设置为“public-read”。


推荐阅读