我一直在尝试从Amazon S3下载一个以特殊字符结尾的文件。
文件名以" ="结尾。作为Base64编码的结果。现在我正在尝试下载此文件,但收到错误,
指定的密钥不存在。 (服务:Amazon S3;状态代码:404;错误代码:NoSuchKey;
我尝试过URL编码字符串。所以现在" ="成为"%3D"我仍然收到同样的错误。 但如果我删除" ="从文件名,我可以无问题地下载文件。但这是一个常见的文件,也可以从iOS访问。
注意:即使文件名具有" =" iOS iOS SDK也能正常工作。在里面。 该问题仅在Android SDK中面临。
答案 0 :(得分:1)
键名中的以下字符可能需要额外的代码 处理并可能需要进行URL编码或引用 HEX。强>
其中一些是不可打印的字符,您的浏览器可能无法处理它们,这也需要特殊处理:
确保定义关键名称的应用程序之间的兼容性的最佳做法正在使用:
- Alphanumeric characters [0-9a-zA-Z]
- Special characters !, -, _, ., *, ', (, and )
使用android你需要编码文件名,字符(通常用作运算符):
=
到:
%3D
答案 1 :(得分:1)
安全角色
以下字符集通常可以安全地用于密钥名称:
字母数字字符[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”
如果这些技巧没有任何效果,您必须更改文件名以在创建这些文件时删除“=”。
此致