无法从 Amazon S3 下载具有特殊字符的文件
Posted
技术标签:
【中文标题】无法从 Amazon S3 下载具有特殊字符的文件【英文标题】:Unable to download file with special character from Amazon S3 【发布时间】:2018-05-18 20:27:31 【问题描述】:我一直在尝试从 Amazon S3 下载以特殊字符结尾的文件。
由于 Base64 编码,文件名以“=”结尾。现在我正在尝试下载此文件,但收到错误消息,
指定的键不存在。 (服务:Amazon S3;状态代码:404;错误代码:NoSuchKey;
我尝试了对字符串进行 URL 编码。所以现在“=”变成了“%3D”,我仍然收到同样的错误。 但是,如果我从文件名中删除“=”,我就可以毫无问题地下载文件。但这是一个通用文件,也可以从 ios 访问。
注意:即使文件名中包含“=”,iOS Amazon SDK 也能正常工作。 该问题仅在 android SDK 中存在。
【问题讨论】:
请编辑您的帖子。如果它是关于文件名的,那么在任何地方都使用文件名。从主题开始。 我在文件名中使用“:”时遇到了同样的问题,请查看定义键名的最佳实践。 你能贴出你用过的代码吗?我使用 AWS Java SDK(没有 android)进行检查,它对我来说也很好用=
符号
@TarunLalwani 是的。我可以发布它。不过,这很简单。就像我在问题中提到的那样,这是我仅使用 Android SDK 面临的问题。它甚至适用于 iOS SDK。
如果你是把文件放在那里的人,你可能会考虑使用不同的编码,正如这个问题所建议的那样:***.com/questions/4395706/…
【参考方案1】:
键名中的以下字符可能需要附加代码 处理,并且可能需要进行 URL 编码或引用为 十六进制。
其中一些是不可打印的字符,您的浏览器可能无法处理它们,这也需要特殊处理:
确保定义键名的应用程序之间的兼容性的最佳做法是:
- Alphanumeric characters [0-9a-zA-Z]
- Special characters !, -, _, ., *, ', (, and )
使用android需要对文件名、字符(常用操作符)进行编码:
=
到:
%3D
【讨论】:
我已经在我的问题中提到了这一点。我尝试将“=”的url编码为“%3D”。但我仍然无法下载该文件。我只得到“指定的密钥不存在”【参考方案2】:根据AWS documentation
安全字符
以下字符集通常可以安全地用于键名:
字母数字字符 [0-9a-zA-Z]
特殊字符 !、-、_、.、*、'、(、和)
和
可能需要特殊处理的字符
键名中的以下字符可能需要额外的代码处理,并且可能需要进行 URL 编码或引用为 HEX。其中一些是不可打印的字符,您的浏览器可能无法处理它们,这也需要特殊处理:
和号(“&”)
美元(“$”)
ASCII 字符范围 00–1F 十六进制(0–31 十进制)和 7F(127 十进制)。
'At' 符号(“@”)
等于 ("=")
分号(“;”)
冒号(“:”)
加号(“+”)
空格 - 在某些用途(尤其是多个空格)中可能会丢失重要的空格序列
逗号 (",")
问号(“?”)
所以它确认您“=”需要特殊处理, 如果您用另一个安全字符替换最后一个“=”字符会更好以避免问题...
请尝试将“=”改为“=”
在 iOS 上没有问题,我希望它可能与 Android 环境有关。
您可能会注意到,由于 SH 或 BASH 或 ANDROID shell 环境执行,某些字符也可能被禁止, 另请注意,某些磁盘格式选项(普通 android 外部存储卡上的 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”
如果这些技巧都不起作用,您必须在创建这些文件时更改文件名以删除“=”。
问候
【讨论】:
试过你的方法来逃避=作为=。没用。 看这里,显然 "=" char is not allowed on FAT32, ***.com/questions/2679699/…以上是关于无法从 Amazon S3 下载具有特殊字符的文件的主要内容,如果未能解决你的问题,请参考以下文章
从 Amazon S3 下载 res.download 文件