我正在使用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!'
));
如何上传?
答案 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