我的S3中有一个String字体名称(Joyful Juliana),名称之间有一个空格。其密钥显示为 Joyful Juliana ,并且网址具有Joyful + Juliana编码格式。
在应用程序方面,我尝试使用URLEncoding处理它,但出现SignatureDoesNotMatch错误。
我尝试使用String.replace()和String.replaceAll()函数,但仍然遇到相同的错误。
这是我生成预签名URL的方式:
public String generatePresignedURL(String key) {
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(defaultBucketName, key);
String url = s3Client.generatePresignedUrl(generatePresignedUrlRequest).toString();
return url;
}
我通过的钥匙是这个
String.format("files/fonts/%s", fontItem.getName())
看起来像AWS以自己的方式处理url的编码,如 S3HttpUtils 类中所示。
有什么建议/解决方案吗?
答案 0 :(得分:0)
根据S3的对象键名称指南:https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html
以下字符集通常可以安全地用于键名:
字母数字字符[0-9a-zA-Z]
特殊字符!,-,_,。,*,',(和)
根据S3,由SDK来实现对不安全的特殊字符的处理。 AWS Android SDK-2.3.x和更早版本用于正确处理此问题。 2.4.0中引入了一个回归,该回归对非安全字符进行编码,因此您会得到错误。
如果使用最新版本,建议仅在密钥名称中使用安全字符。