【问题标题】:how do I set content-type when creating a signed url for an object in s3 aws?在 s3 aws 中为对象创建签名 url 时如何设置内容类型?
【发布时间】: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 中提供 -(连字符)?

标签: javascript node.js amazon-web-services amazon-s3 amazon


【解决方案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 中指定唯一的响应内容类型
    猜你喜欢
    • 2014-09-04
    • 2018-09-11
    • 2016-04-05
    • 2014-06-21
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多