php - Laravel s3使用预签名的url上传带有元数据的文件
问题描述
我正在使用预签名的 url 实现 S3 文件上传和下载。我有一个 s3 存储桶(启用了版本控制)和一个 AWS 用户,但我想根据我的哪些应用程序用户修改了文件来跟踪每个文件的历史记录。
我有一个版本化的 S3 存储桶,我的想法是我可以将元数据附加到每个文件以识别我的应用程序用户以及可能的其他数据。
这是我的代码:
public function presignedUpload(Request $request)
{
$this->validate($request, [
'name' => 'string|required'
]);
$s3 = Storage::disk('s3');
$client = $s3->getDriver()->getAdapter()->getClient();
$expiry = "+10 minutes";
$options = ['user-data' => 'user-meta-value'];
$cmd = $client->getCommand('PutObject', [
'Bucket' => \Config::get('filesystems.disks.s3.bucket'),
'Key' => 'path/to/file/' . $request->name,
'ACL' => 'public-read',
], $options);
$request = $client->createPresignedRequest($cmd, $expiry);
$presignedUrl = (string)$request->getUri();
return response()->json(['url' => $presignedUrl], 201);
}
我推断我可以$options
从FilesystemAdapter::class
. 此代码确实上传了文件,但 AWS 中的元数据看起来是空的。
我的$options
数组格式错误吗?
感谢您对此的任何帮助。
解决方案
元数据可以像这样上传:
public function presignedUpload(Request $request)
{
$this->validate($request, [
'name' => 'string|required'
]);
$s3 = Storage::disk('s3');
$client = $s3->getDriver()->getAdapter()->getClient();
$expiry = "+10 minutes";
$options = ['user-data' => 'user-meta-value'];
$cmd = $client->getCommand('PutObject', [
'Bucket' => \Config::get('filesystems.disks.s3.bucket'),
'Key' => 'path/to/file/' . $request->name,
'ACL' => 'public-read',
'Metadata' => $options,
]);
$request = $client->createPresignedRequest($cmd, $expiry);
$presignedUrl = (string)$request->getUri();
return response()->json(['url' => $presignedUrl], 201);
}
推荐阅读
- database-indexes - 选择表上的索引
- javascript - 将动态 api 响应分配给 typescript 接口
- java - activemq 可信包问题
- php - 使用 CodeIgniter 的 API 调用
- azure - 术语“Get-AzureRmDataFactoryV2”未被识别为 cmdlet 的名称
- java - Kafka Producer 超时异常处理指南?
- flutter - 实现 TextOverflow.ellipsis 和 FittedBox
- java - Scala嵌套表达式不带参数
- angular - Angular Firebase 背景消息
- javascript - 关键依赖:依赖的请求是 jQuery Form Validator 插件上的表达式