2011-08-25 31 views
1

我正在使用https://github.com/tpyo/amazon-s3-php-class進行存儲和檢索對象。如果對象包含沒有特殊字符的普通名稱,它工作正常。但如果對象包含[]字符(就像[test] .jpg我只爲此測試過)如果我使用getobject方法,它將引發錯誤NoSuchakey。帶特殊字符的Amazon S3對象會引發錯誤?

如果我直接獲取S3 URL並粘貼到瀏覽器中,我可以下載圖像。

但我想使用getobject方法。所以如何避免這個錯誤。我不想改變原來的對象名稱。

編輯:

PHP版本5.2.6

+0

你是不是忘記申請[URL編碼(http://php.net/manual/en/function.urlencode.php)? –

+0

$ rest = new S3Request('GET',$ bucket,$ uri)這裏我需要應用URL Encode? – svk

+0

nvm,它已經爲你''rawurlencode($ uri)' –

回答

1

我看到在評論本說明爲rawurlencode上php.net:

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

歷史o ˚F相關的RFC:

RFC 1738第2.2節只有字母數字,特殊字符 「!$ -_ + *「()」,並用於其保留 目的的保留字符可以在URL中使用未編碼。

RFC 2396 section 2.3 unreserved = alphanum | mark mark =「 - 」 | 「_」| 「」 | 「!」 | 「〜」| 「*」| 「'」| 「(」 | 「)」

RFC 2732第3(3)添加 「[」 和 「]」 到該組 '保留' 字符:

RFC 3986第2.3節的未預留= 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); 
+0

謝謝史蒂夫-0。它不工作。而且我的PHP版本是5.2.6 – svk