带有特殊字符的Amazon S3对象抛出错误


Amazon S3 object with special characters throws error?

我使用https://github.com/tpyo/amazon-s3-php-class存储和检索对象。如果对象包含正常名称而不包含特殊字符,则工作正常。但是如果对象包含[]字符(像[test].jpg我只测试了这个),如果我使用geobject方法,它会抛出一个错误NoSuchakey。

如果我直接获得S3 URL并粘贴到浏览器中,我就可以下载图像。

但是我想使用geobject方法。那么如何避免这种错误呢?我不想改变原来的对象名称。

编辑:

PHP Version 5.2.6

我在php.net上的rawurlencode评论中看到了这个注释:

phpversion()>=5.3将符合RFC 3986,而phpversion()<=5.2.7RC1不符合RFC 3986.

相关rfc的历史:

RFC 1738节2.2只允许字母数字、特殊字符"$-_.+!*'() ",以及用于其保留的保留字符目的可以在URL中不加编码地使用。

RFC 2396 section 2.3 unreserved = alphanum | mark mark = "-"|"_"|"。"|"!"|"~"|"*"|"‘"|("|")"

RFC 2732 section 3(3)在'reserved'集合中添加"["answers"]"人物:

RFC 3986 section 2.3 unreserved = ALPHA/DIGIT/"-"/"."/"_"/"~"

RFC 3987 section 2.2 unreserved = ALPHA/DIGIT/"-"/"."/"_"/"~"

以下代码在5.3.2和5.2.15上产生相同的输出:
<? echo rawurlencode ("[hello]") . "'n'n"; ?>
%5Bhello%5D

您是否可以尝试创建S3.php的副本并更改S3Request以修改$this->url:

$this->uri = $uri !== '' ? '/'.str_replace('%2F', '/', rawurlencode($uri)) : '/';
$this->url = str_replace("%5B", "[", $this->url);
$this->url = str_replace("%5D", "]", $this->url);