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

时间:2018-08-12 15:26:31

标签: php amazon-web-services amazon-s3 pre-signed-url

我正在使用PHP开发Web应用程序。在我的应用程序中,我需要使用Presigned 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();

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

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

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

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

如何上传?

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

如果您想创建一个浏览器可以提交的 URL,那么您需要让浏览器将文件作为表单 POST 发送。此 AWS 文档说明了如何创建预签名的 POST 请求字段,然后您需要将其放入 HTML 表单并显示给用户:https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/s3-presigned-post.html

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