使用 PHP 中的预签名 URL 将文件上传到 S3

Wai*_*ein 10 php amazon-s3 amazon-web-services pre-signed-url

我正在使用 PHP 开发 Web 应用程序。在我的应用程序中,我需要使用预签名 URL 将文件上传到 AWS S3 存储桶。现在,我可以使用这样的预签名从 S3 存储桶中读取私有文件。

$s3Client = new S3Client([
            'version' => 'latest',
            'region' => env('AWS_REGION', ''),
            'credentials' => [
                'key' => env('AWS_IAM_KEY', ''),
                'secret' => env('AWS_IAM_SECRET', '')
            ]
        ]);

            //GetObject
        $cmd = $s3Client->getCommand('GetObject', [
                'Bucket' => env('AWS_BUCKET',''),
                'Key'    => 'this-is-uploaded-using-presigned-url.png'
            ]);

        $request = $s3Client->createPresignedRequest($cmd, '+20 minutes');


        //This is for reading the image. It is working.
        $presignedUrl = (string) $request->getUri();
Run Code Online (Sandbox Code Playgroud)

当我$presignedUrl从浏览器访问时,我可以从 s3 获取文件。这是工作。但是现在,我正在将文件上传到 S3。不从 s3 读取文件。通常,我可以像这样将文件上传到 S3。

$client->putObject(array(
    'Bucket' => $bucket,
    'Key'    => 'data.txt',
    'Body'   => 'Hello!'
));
Run Code Online (Sandbox Code Playgroud)

上面的代码没有使用预先签名的 URL。但我需要使用预先签名的 URL 上传文件。如何使用预先签名的 URL 上传文件。例如,我在想的是这样的事情。

$client->putObject(array(
        'presigned-url' => 'url'
        'Bucket' => $bucket,
        'Key'    => 'data.txt',
        'Body'   => 'Hello!'
    ));
Run Code Online (Sandbox Code Playgroud)

我怎样才能上传?

Gus*_*uss 6

PutPobject您可以通过运行以下命令来创建预签名命令,这似乎是合理的:

$cmd = $s3Client->getCommand('PutObject', [
  'Bucket' => $bucket,
  'Key'    => $key
]);

$request = $s3Client->createPresignedRequest($cmd, '+20 minutes')->withMethod('PUT');
Run Code Online (Sandbox Code Playgroud)

然后您可能想使用以下PUT命令从 PHP 执行调用:

file_put_contents(
  $request->getUri(),
  'Hello!',
  stream_context_create(['http' => [ 'method' => 'PUT' ]])
);

Run Code Online (Sandbox Code Playgroud)

如果要创建浏览器可以提交的 URL,则需要让浏览器以表单 POST 的形式发送文件。此 AWS 文档介绍了如何使用您需要放入 HTML 表单并向用户显示的字段创建预签名的 POST 请求:https: //docs.aws.amazon.com/sdk-for-php/ v3/developer-guide/s3-presigned-post.html

另外,这个答案可能有用:https ://stackoverflow.com/a/59644117/53538