当使用签名URL从客户端上载文件时,如何设置S3 putObject选项

时间:2015-02-07 16:47:54

标签: amazon-web-services amazon-s3

我正在使用已签名的网址将文件直接从客户端直接上传到我的S3存储桶中。为此,我在创建了我想要执行的命令的签名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');

但是,在执行put请求并上传文件后,Cache-ControlContent-Encoding标头未设置。

有谁知道我哪里出错了?

1 个答案:

答案 0 :(得分:2)

仍然必须在PUT请求中设置标头。将它们包含在已签名的URL中是不够的。

预签名网址仅用于确保实际请求参数与授权请求参数匹配(否则请求失败)。

所以,如果我所说的是正确的,那么如果这些参数不随请求一起发送,那么它应该失败,对吗?几乎。

不幸的是,V2身份验证不会验证所有请求标头,例如Content-Encoding

  

请注意,只有Content-Type和Content-MD5 HTTP实体标头出现在StringToSign中。其他Content- *实体标题不会。

     

- http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html

Cache-Control也是如此。只有x-amz-*标头才能根据V2中提供的签名进行验证(在查询字符串中使用&Signature=)。

V4 auth(相反,在查询字符串中使用&X-Amz-Signature=)包含一种机制,允许您指定哪些标题需要针对签名进行验证,但在任何一种情况下,您都必须使用实际请求本身,而不仅仅是将它们包含在签名中。看来你不是,这就是他们没有被设置的原因。