首页 > 解决方案 > 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);
    }

我推断我可以$optionsFilesystemAdapter::class. 此代码确实上传了文件,但 AWS 中的元数据看起来是空的。

我的$options数组格式错误吗?

感谢您对此的任何帮助。

标签: phplaravelamazon-web-servicesamazon-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',
            'Metadata' => $options,
        ]);

        $request = $client->createPresignedRequest($cmd, $expiry);

        $presignedUrl = (string)$request->getUri();

        return response()->json(['url' => $presignedUrl], 201);
    }

推荐阅读