在 s3 aws 中为对象创建签名 url 时如何设置内容类型?

Posted

技术标签:

【中文标题】在 s3 aws 中为对象创建签名 url 时如何设置内容类型?【英文标题】:how do I set content-type when creating a signed url for an object in s3 aws? 【发布时间】:2015-02-16 20:20:00 【问题描述】:

我想创建一个带有自定义内容类型的签名网址,我正在尝试这个:

s3.getSignedUrl('getObject', Bucket: AWS_BUCKET_NAME, Key: 'myObjectsKey', ContentType: 'image/png', function (err, url) 
    console.log(err, url);
);

但是这会产生错误:

 [UnexpectedParameter: Unexpected key 'ContentType' found in params]
  message: 'Unexpected key \'ContentType\' found in params',
  code: 'UnexpectedParameter',
  time: Thu Dec 18 2014 01:38:19 GMT-0400 (AST) 

我觉得很奇怪,因为这里有关于签名请求的文档:

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

声明签名是通过散列生成的:

Signature = URL-Encode(Base64(HMAC-SHA1(YourSecretAccessKeyID, UTF-8-Encoding-Of(StringToSign))));

StringToSign = HTTP-VERB + "\n" +
    Content-MD5 + "\n" +
    Content-Type + "\n" +
    Expires + "\n" +
    CanonicalizedAmzHeaders +
    CanonicalizedResource;  

这允许您提供内容类型。有谁知道怎么回事?

【问题讨论】:

您是否尝试在 Contenttype 中提供 -(连字符)? 【参考方案1】:

这肯定已经更新了,因为您现在可以这样做了,只需使用ResponseContentType 而不是ContentType。查看GET Object Docs。

const params = 
  Bucket: bucket, 
  Key: key, 
  Expires: 60, 
  ResponseContentType: 'image/png'
;

s3.getSignedUrl('getObject', params, function (err, url) 
  if (url) callback(null, url);
  else     callback(err, null);
);

即使使用Saz files,我也对其进行了测试,效果很好。

【讨论】:

【参考方案2】:

内容类型不是签名 URL 的一部分。它必须在 S3 中的对象上设置。这可以在上传时完成 (http://docs.aws.amazon.com/AWSjavascriptSDK/latest/AWS/S3.html#putObject-property),或者您可以使用新的内容类型 (http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#copyObject-property) 将对象复制到自身。

【讨论】:

虽然是的,但这是一种仅使用文件指定的 Content-Type 上传文档的方法(我认为它可能默认为 binary/octet-stream,默认为客户端嵌入下载)您可以事实上,在@cameck 解决方案中提到的预签名 URL 中指定唯一的响应内容类型

以上是关于在 s3 aws 中为对象创建签名 url 时如何设置内容类型?的主要内容,如果未能解决你的问题,请参考以下文章

AWS S3 存储桶预签名 URL

如何使用预签名的 url 将对象放入 amazon s3?

AWS S3 生成签名 URL ''AccessDenied''

AWS S3 通过预签名 URL 上传返回 400 错误请求

使用预签名 URL 上传到 Amazon S3 时限制对象大小

在 BIM360 OSS 中为对象创建签名 URL