带有非ASCII Content-Disposition标头的S3 PutObjectRequest抛出异常

时间:2018-04-19 11:58:34

标签: amazon-web-services amazon-s3 aws-sdk

我使用aws-sdk for java将文件上传到s3(法兰克福地区)。

ObjectMetadata omd = new ObjectMetadata();
omd.setContentDisposition("attachment;filename=\"" + someFileNameWithNonASCIIChars + "\"");
...
PutObjectRequest por = new PutObjectRequest(bucket, key, stream, omd);

...

s3Object.putObject(por);

最后一行抛出AmazonServiceException说明SignatureDoesNotMatch作为原因:

  

我们计算的请求签名与您的签名不符   提供。

仅当非ASCII字符位于Content-Disposition标头值中时才会发生这种情况。

我知道无法处理utf-8编码解码的浏览器的解决方法:

How to encode the filename parameter of Content-Disposition header in HTTP?

我可以使用这个解决方案。 但这是S3的预期结果吗? 有没有办法在Content-Disposition标头中发送UTF-8字符?然后我可以让浏览器处理非ASCII字符。

此外,使用*=utf-8''解决方法会导致空格被解码为“+”符号而不是返回空格,这并不理想。它解释了here

感谢。

1 个答案:

答案 0 :(得分:2)

  

但这是S3的预期结果吗?

不幸的是,确实如此。当标题包含非ascii字符时,S3的一个长期存在的问题会阻止实际上正确的签名被检测为正确,因为该服务实际上错误地计算了签名 - 显然原始设计假设utf-8字符不应该& #39;在那里......所以不能使用utf-8值。

对于+问题,只需在进行编码后将其更改为%20即可。编码前文件名中的任何实际+都会在编码字符串中显示为%2B,因此任何剩余的+实际上都是空格。