Android 无法从Amazon S3下载具有特殊字符的文件

Android 无法从Amazon S3下载具有特殊字符的文件,android,amazon-s3,aws-sdk,Android,Amazon S3,Aws Sdk,我一直在尝试从AmazonS3下载一个以特殊字符结尾的文件。 由于Base64编码,文件名以“=”结尾。现在我正试图下载此文件,但收到一个错误 指定的密钥不存在。(服务:Amazon S3;状态代码:404;错误代码:NoSuchKey; 我尝试对字符串进行URL编码。所以现在“=”变为“%3D”,我仍然收到相同的错误。 但是,如果我从文件名中删除“=”,我就可以毫无问题地下载该文件。但这是一个常见的文件,也可以通过iOS访问 注意:iOS Amazon SDK即使文件名中有“=”也可以工作

我一直在尝试从AmazonS3下载一个以特殊字符结尾的文件。

由于Base64编码,文件名以“=”结尾。现在我正试图下载此文件,但收到一个错误

指定的密钥不存在。(服务:Amazon S3;状态代码:404;错误代码:NoSuchKey;

我尝试对字符串进行URL编码。所以现在“=”变为“%3D”,我仍然收到相同的错误。 但是,如果我从文件名中删除“=”,我就可以毫无问题地下载该文件。但这是一个常见的文件,也可以通过iOS访问

注意:iOS Amazon SDK即使文件名中有“=”也可以工作。 这个问题只有在Android SDK中才能解决

键名中的以下字符可能需要附加代码 处理和可能需要URL编码或引用为 十六进制。

其中一些是不可打印的字符,您的浏览器可能无法处理它们,这也需要特殊处理:

确保定义键名的应用程序之间兼容性的最佳做法是使用:

- Alphanumeric characters [0-9a-zA-Z]
- Special characters !, -, _, ., *, ', (, and )
使用android,您需要对文件名、字符(通常用作运算符)进行编码:

致:

安全字符

以下字符集通常可以安全地用于密钥名:

字母数字字符[0-9a-zA-Z]

特殊字符!、-、、*、'、(、和)

可能需要特殊处理的字符

键名中的以下字符可能需要额外的代码处理,可能需要URL编码或以十六进制引用。其中一些是不可打印的字符,您的浏览器可能无法处理它们,这也需要特殊处理:

符号(&)

美元($)

ASCII字符范围为00–1F十六进制(0–31十进制)和7F(127十进制)

“At”符号(“@”)

等于(“=”)

分号(“;”)

冒号(“:”)

加号(“+”)

空间–某些用途(尤其是多个空间)可能会丢失重要的空间序列

逗号(“,”)

问号(“?”)

因此它确认“=”需要特殊处理, 最好用另一个安全字符替换最后一个“=”字符,以避免此问题

请尝试将“=”更改为“=


正如在iOS上一样,没有问题,我希望它可能与Android环境有关

您可能会注意到,由于SH或BASH或ANDROID shell环境执行, 还请考虑到某些磁盘格式选项(普通android外部存储卡上的FAT32)也可能表示文件名中禁止某些字符的因素

如果你看一看,尤其是@kreker答案:

根据wiki,假设您使用的是具有FAT32的外部数据存储

Allowable characters in directory entries

Any byte except for values 0-31, 127 (DEL) and: " * / : < > ? \ | + , . ; = [] (lowcase a-z are stored as A-Z). With VFAT LFN any Unicode except NUL
“VCS…=.png”

如果这些技巧都不起作用,那么在创建这些文件时,您必须更改文件名以删除“=”


关于

请编辑您的帖子。如果是关于文件名的,则在任何地方使用文件名。从主题开始。我在文件名中使用“:”时遇到了同样的问题。请检查定义键名的最佳实践。您可以发布您使用的代码吗?我使用AWS Java SDK(不带android)进行检查它使用
=
符号对我来说很好also@TarunLalwani是的。我可以发布它。它只是直接向前。就像我在我的问题中提到的,这是一个我只面对Android SDK的问题。它甚至在iOS SDK上工作。如果你是把文件放在那里的话,你可能会考虑不同的编码,如建议的那样。在这个问题中:我已经在我的问题中提到了这一点。我尝试了将“=”编码为“%3D”的url。但是我仍然无法下载该文件。我只得到了“指定的密钥不存在”尝试了您的escape=as=的方法。不起作用。请看这里,FAT32上显然不允许“=”字符,
Allowable characters in directory entries
Any byte except for values 0-31, 127 (DEL) and: " * / : < > ? \ | + , . ; = [] (lowcase a-z are stored as A-Z). With VFAT LFN any Unicode except NUL
cp filename=.png mynewfile=.png #before


cp "filename=.png" "mynewfile=.png" #after