我的S3中有一个字符串字体名称(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类所示。
任何建议/解决方案?
根据S3对象键名称的指导:https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html
以下字符集通常可以安全地用于密钥名称:
字母数字charatters 0-ya-for-3h
特殊字符!, - ,_,。,*,',(和)
根据S3,由SDK来实现对不安全的特殊字符的处理。 AWS Android SDK - 2.3.x及更早版本用于正确处理此问题。在2.4.0中引入了回归,它对非安全字符进行编码,因此您会收到错误。
如果您使用的是最新版本,建议仅在您的密钥名称中使用安全字符。