使用签名 URL 从客户端上传文件时如何设置 S3 putObject 选项
How can I set S3 putObject options when using signed URL's to upload files from the client
我正在使用已签名的 urls 将文件直接从客户端直接上传到我的 S3 存储桶中。为此,我在创建要执行的命令的已签名 URL 后执行直接放置请求以上传文件本身。
我像这样创建签名的 url:
$command = $s3->getCommand('PutObject', array(
'Bucket' => $this->_bucket,
'Key' => $key,
'ACL' => 'public-read',
'CacheControl' => 'max-age=0',
'ContentEncoding' => 'gzip',
'ContentType' => $filetype,
'Body' => '',
'ContentMD5' => false
));
$signedUrl = $command->createPresignedUrl('+6 hours');
但是,在执行放置请求并上传文件本身之后,Cache-Control
和 Content-Encoding
headers 未设置。
有人知道我哪里出错了吗?
headers 仍然需要在 PUT
请求中设置。将它们包含在已签名的 url 中是不够的。
pre-signedURL仅用于确保实际请求参数匹配授权请求参数(否则请求失败)。
所以,如果我说的是正确的,那么如果这些参数没有随请求一起发送,它应该会失败,对吧?差不多。
不幸的是,V2 身份验证不会验证所有请求 headers,例如 Content-Encoding
例如:
Note how only the Content-Type and Content-MD5 HTTP entity headers appear in the StringToSign. The other Content-* entity headers do not.
— http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html
Cache-Control
也是如此。只有 x-amz-*
headers 需要根据 V2 中提供的签名进行验证(在查询字符串中使用 &Signature=
)。
V4 auth(相比之下,在查询字符串中使用 &X-Amz-Signature=
)包含一种机制,允许您指定哪些 headers 需要针对签名进行验证,但在任何一种情况下,您都有将 headers 与实际请求本身一起发送,而不仅仅是将它们包含在签名中。看来你不是,这就是为什么他们没有设置。
我正在使用已签名的 urls 将文件直接从客户端直接上传到我的 S3 存储桶中。为此,我在创建要执行的命令的已签名 URL 后执行直接放置请求以上传文件本身。
我像这样创建签名的 url:
$command = $s3->getCommand('PutObject', array(
'Bucket' => $this->_bucket,
'Key' => $key,
'ACL' => 'public-read',
'CacheControl' => 'max-age=0',
'ContentEncoding' => 'gzip',
'ContentType' => $filetype,
'Body' => '',
'ContentMD5' => false
));
$signedUrl = $command->createPresignedUrl('+6 hours');
但是,在执行放置请求并上传文件本身之后,Cache-Control
和 Content-Encoding
headers 未设置。
有人知道我哪里出错了吗?
headers 仍然需要在 PUT
请求中设置。将它们包含在已签名的 url 中是不够的。
pre-signedURL仅用于确保实际请求参数匹配授权请求参数(否则请求失败)。
所以,如果我说的是正确的,那么如果这些参数没有随请求一起发送,它应该会失败,对吧?差不多。
不幸的是,V2 身份验证不会验证所有请求 headers,例如 Content-Encoding
例如:
Note how only the Content-Type and Content-MD5 HTTP entity headers appear in the StringToSign. The other Content-* entity headers do not.
— http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html
Cache-Control
也是如此。只有 x-amz-*
headers 需要根据 V2 中提供的签名进行验证(在查询字符串中使用 &Signature=
)。
V4 auth(相比之下,在查询字符串中使用 &X-Amz-Signature=
)包含一种机制,允许您指定哪些 headers 需要针对签名进行验证,但在任何一种情况下,您都有将 headers 与实际请求本身一起发送,而不仅仅是将它们包含在签名中。看来你不是,这就是为什么他们没有设置。