我使用s3直接上传与数据库一起存储文件的url(以及其他数据,如谁上传等)。为了允许直接上传到s3,我创建了一个预先指定的URL,如:
$s3 = App::make('aws')->createClient('s3', [
'credentials' => [
'key' => 'AAAAAAAAAAAAAAA',
'secret' => 'YYYYYYYYYYYYYYYYYYYY',
]
]);
$command = $s3->getCommand('PutObject', [
'@use_accelerate_endpoint'=>true,
'Bucket' => 'remdev-experimental',
'Key' => "newest newest.txt",
'Metadata' => array(
'foo' => "test",
)
]);
return response()->json(((string)$s3->createPresignedRequest($command, '+1 minutes')->getUri()));
现在,在客户端完成文件上传后,我想让服务器知道它。所以我会要求客户给我发一个请求,通知他已经完成了上传。对此,我认为最简单(也是最安全)的方法就是允许客户端发送回他刚刚发送回来的签名URL。
是否有解析URL的方法?我对获得对象密钥感兴趣,更重要的是,我想验证URL没有被篡改(也就是说,URL中的签名应该与其余内容匹配)。如何在php sdk中做到这一点?
签名URL是文件的URL,其中包含了查询数据中的签名信息。因此,对bucket: remdev-experimental
文件:abc.txt
的签名请求看起来像https://s3.amazonaws.com/remdev-experimental/abc.txt?X-Amz-Date=date&X-Amz-Expires=60&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Signature=signature&X-Amz-Credential=SOMEID/20160703/us-east-1/s3/aws4_request&X-Amz-SignedHeaders=Host&x-amz-security-token=some-long-token
,因此您需要做的就是获取URL的路径(/remdev-experimental/abc.txt
)并接受第二个斜杠之后的所有内容。
您还应该知道,您可以让S3在HTTP post策略中使用success_action_redirect
将浏览器重定向到URL
最后你可以让S3触发一个通知到你的服务器(通过SQS, SNS,或Lambda)每当一个文件被上传