我使用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。
感谢。
答案 0 :(得分:2)
但这是S3的预期结果吗?
不幸的是,确实如此。当标题包含非ascii字符时,S3的一个长期存在的问题会阻止实际上正确的签名被检测为正确,因为该服务实际上错误地计算了签名 - 显然原始设计假设utf-8字符不应该& #39;在那里......所以不能使用utf-8值。
对于+
问题,只需在进行编码后将其更改为%20
即可。编码前文件名中的任何实际+
都会在编码字符串中显示为%2B
,因此任何剩余的+
实际上都是空格。