无法从 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 下载具有特殊字符的文件的主要内容,如果未能解决你的问题,请参考以下文章

使用send_file从Amazon S3下载文件吗?

处理从 Amazon S3 下载的多个文件?

从 Amazon S3 下载 res.download 文件

从 Amazon S3 SSL 错误下载 iOS 9 应用程序:TLS 1.2 支持

使用 php 从 Amazon s3 压缩和下载文件

使用 AWS 开发工具包从 Amazon S3 下载文件后如何删除文件