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

时间:2017-12-05 08:33:42

标签: android amazon-s3 aws-sdk

我一直在尝试从Amazon S3下载一个以特殊字符结尾的文件。 enter image description here

文件名以" ="结尾。作为Base64编码的结果。现在我正在尝试下载此文件,但收到错误,

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

enter image description here

我尝试过URL编码字符串。所以现在" ="成为"%3D"我仍然收到同样的错误。 但如果我删除" ="从文件名,我可以无问题地下载文件。但这是一个常见的文件,也可以从iOS访问。

注意:即使文件名具有" =" iOS iOS SDK也能正常工作。在里面。 该问题仅在Android SDK中面临。

2 个答案:

答案 0 :(得分:1)

  

键名中的以下字符可能需要额外的代码   处理并可能需要进行URL编码或引用   HEX。

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

enter image description here

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

- Alphanumeric characters [0-9a-zA-Z]
- Special characters !, -, _, ., *, ', (, and )

使用android你需要编码文件名,字符(通常用作运算符):

=

到:

%3D

答案 1 :(得分:1)

根据AWS documentation

  

安全角色

     

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

     

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

     

特殊字符!, - ,_,。,*,',(和)

  

可能需要特殊处理的字符

     

密钥名称中的以下字符可能需要额外的代码处理,并且可能需要进行URL编码或引用为HEX。其中一些是不可打印的字符,您的浏览器可能无法处理它们,这也需要特殊处理:

     

&符号(“&”)

     

美元(“$”)

     

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

     

'At'符号(“@”)

     

等于(“=”)

     

分号(“;”)

     

冒号(“:”)

     

加号(“+”)

     

空间 - 在某些用途(特别是多个空间)中,重要的空间序列可能会丢失

     

逗号(“,”)

     

问号(“?”)

所以它确认你“=”需要特殊处理, 如果你用另一个安全字符替换最后一个“=”字符来避免这个问题会更好......

请尝试将“ = ”更改为“&#61

与iOS一样,没有问题,我希望它可能与Android环境相关。

您可能会注意到某些字符也可能被禁止,因为SH或BASH或ANDROID shell环境执行, 另请注意,某些磁盘格式选项(普通安卓外部存储卡上的FAT32)也可能代表禁止文件名中某些字符的因素。

如果你看看here,尤其是@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

你会注意到=不是android FAT32分区上的允许字符...

由于我预计Android会将=视为限制字符,您可以尝试使用\=转义它,或者在代码中为文件名添加引号...

包含副本的示例:

cp filename=.png mynewfile=.png #before


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

“VCS ... =。PNG”

如果这些技巧没有任何效果,您必须更改文件名以在创建这些文件时删除“=”。

此致