由于空白空间,android的AWS S3预签名URL导致SignatureDoesNotMatch错误

时间:2018-07-24 07:40:47

标签: android amazon-web-services amazon-s3

我的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 类中所示。

有什么建议/解决方案吗?

1 个答案:

答案 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中引入了一个回归,该回归对非安全字符进行编码,因此您会得到错误。

如果使用最新版本,建议仅在密钥名称中使用安全字符。