使用签名 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-ControlContent-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 与实际请求本身一起发送,而不仅仅是将它们包含在签名中。看来你不是,这就是为什么他们没有设置。