我想创建一个带有自定义内容类型的签名网址,我试过这个:
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
声明签名是通过散列进行的:
签名= 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;
允许您提供内容类型。有谁知道发生了什么事?
答案 0 :(得分:3)
这必须已更新,因为您现在可以执行此操作,只需使用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测试了它,效果很好。
答案 1 :(得分:0)
内容类型不是签名网址的一部分。它必须在S3中的Object上设置。这可以在上传(http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property)时完成,也可以使用新的内容类型(http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#copyObject-property)将对象复制到自身。