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

时间:2011-08-25 07:33:45

标签: php amazon-s3

我使用https://github.com/tpyo/amazon-s3-php-class存储并检索对象。如果对象包含没有特殊字符的普通名称,它工作正常。但如果对象包含[]字符(如[test] .jpg I仅针对此测试)如果我使用getobject方法,它将抛出错误NoSuchakey。

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

但是我想使用getobject方法。所以如何避免这个错误。我不想改变原始对象名。

修改

PHP Version 5.2.6

1 个答案:

答案 0 :(得分:1)

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

  

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

     

相关RFC的历史:

     RFC 1738第2.2节只有字母数字,特殊字符   “$ -_。+!*'(),”和保留字符用于保留   目的可以在URL中以未编码的方式使用。

     

RFC 2396第2.3节无保留= alphanum | mark mark =“ - ”   | “_”| “” | “!” | “〜”| “*”| “'”| “(”|“)”“

     

RFC 2732第3(3)条将“[”和“]”添加到'保留'的集合中   字符:

     

RFC 3986第2.3条无保留= ALPHA / DIGIT /“ - ”/“。” /“_”/   “〜”

     

RFC 3987第2.2节无保留= 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);