我一直试图从亚马逊S3下载一个以特殊字符结尾的文件。

由于Base64编码的结果,文件名以"=“结尾。现在我正在尝试下载这个文件,我收到了一个错误,
指定的键不存在。(服务: S3;状态代码: 404;错误代码: NoSuchKey;

我尝试了URL编码字符串。因此,现在"=“变成了"%3D”,而我仍然收到同样的错误。但是,如果我从文件名中删除"=“,我就可以下载该文件,而不会出现问题。但是这是一个常见的文件,它也可以从iOS中访问。
注意:即使文件名中包含"=“,iOS Amazon也能工作。这个问题只有在Android中才会面临。
发布于 2017-12-11 13:12:31
根据AWS文件
安全字符 以下字符集通常在关键字名称中使用是安全的: 字母数字字符0-9a-zA 特殊字符!,-,_,.,*,',(和)
和
可能需要特殊处理的字符 密钥名中的下列字符可能需要额外的代码处理,并且可能需要将URL编码或引用为HEX。其中有些是不可打印的字符,您的浏览器可能无法处理这些字符,这也需要特殊处理: 符号("&") 美元(“美元”) ASCII字符范围为00-1 F十六进制(0-31小数点)和7F (小数点127)。 ‘'At’符号("@") 等于("=") 分号(";") 冒号(":") + ("+") 空间有意义的空间序列可能会在某些用途(特别是多个空间)中丢失。 逗号(",") 问号("?")
因此,它确认"=“需要特殊处理,最好用另一个安全字符替换最后一个"=”字符,以避免问题.
请尝试将"=“改为"=”
就像在iOS上一样,没有问题,我希望它可能是相对于安卓环境。
您可能会注意到,某些字符也可能被禁止,因为SH或BASH或ANDROID环境执行时,还请考虑到某些磁盘格式选项(正常的android外部存储卡上的FAT32)也可能是禁止文件名中某些字符的因素。
如果您查看一下这里,尤其是@kreker的答案:
根据wiki,并假设您使用的是具有FAT32的外部数据存储。 目录条目中的允许字符 是 任何字节,除了值0-31,127 (DEL)和:“*/:<>?\+,.;= 小写a-z存储为A-Z。
您将注意到,=是android FAT32分区上不允许的字符.
正如我所期望的,Android将考虑=作为受限字符,您可以尝试使用\=来转义它,或者在代码中的文件名中添加引号.
一个有副本的例子:
cp filename=.png mynewfile=.png #before
cp "filename=.png" "mynewfile=.png" #after"VCS...=.png“
如果这些技巧都不起作用,那么在创建这些文件时,必须更改文件名以删除"=“。
问候
发布于 2017-12-07 19:17:25
密钥名中的下列字符可能需要额外的代码处理,可能需要将其编码或引用为HEX.。
其中有些是不可打印的字符,您的浏览器可能无法处理这些字符,这也需要特殊处理:

确保定义关键名称的应用程序之间的兼容性的最佳实践使用:
- Alphanumeric characters [0-9a-zA-Z]
- Special characters !, -, _, ., *, ', (, and )使用android,您需要对文件名、字符(通常用作操作符)进行编码:
=致:
%3D发布于 2022-06-14 22:24:28
首先,我认为您正在使用CopyObjects方法的s3。或者您从s3事件或试图下载的其他地方接收到一个文件名。问题是aws在存储名称时处理特殊字符的方式不同。如果要转到s3控制台并单击文件名的话。您将看到URI将具有不同的值,用于特殊字符(如空格)将被+替换。因此,您需要相应地处理特殊字符。误导性示例不会对您有帮助,因为aws对文件名有限制,但是如果您保存它们,它将用可接受的字符替换它们,并且您的实际文件名将不同于您上传的文件名,因此找不到文件。
https://stackoverflow.com/questions/47649185
复制相似问题