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)
我怎样才能上传?
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
| 归档时间: |
|
| 查看次数: |
1183 次 |
| 最近记录: |