我使用https://github.com/tpyo/amazon-s3-php-class存储和检索对象。如果对象包含正常名称而不包含特殊字符,则工作正常。但是如果对象包含[]字符(像[test].jpg我只测试了这个),如果我使用geobject方法,它会抛出一个错误NoSuchakey。
如果我直接获得S3 URL并粘贴到浏览器中,我就可以下载图像。
但是我想使用geobject方法。那么如何避免这种错误呢?我不想改变原来的对象名称。
编辑:PHP Version 5.2.6
我在php.net上的rawurlencode
评论中看到了这个注释:
以下代码在5.3.2和5.2.15上产生相同的输出: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/"-"/"."/"_"/"~"
<? 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);