laravel - 如何在 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。
解决方案
我得到了这个问题的解决方案。我联系了 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”。
推荐阅读
- ios - 如何指向和定位 arkit 文本
- c# - 访问从反射获得的私有类型列表的内容
- c# - 在没有 EDMX 的 LINQ 语句中调用标量函数
- javascript - 使用 Koa、js 和 MongoDb
- boto3 - Airflow S3KeySensor - 如何让它继续运行
- python-3.x - 如何通过用户输入对字符串进行排序
- oracle - ORA-01882 尝试对表执行任何操作时
- excel - 为什么 Excel VBA Range.Find 返回不正确的值?
- java - 在 Java 中实现文件身份验证的最佳方法是什么?
- maven - 如何使用 gmavenplus 运行的 groovy 脚本设置 maven 项目属性?