2010-07-27 21 views
0

我正在使用PHP S3.PHP類管理Amazon S3上的文件。我使用copyObject()函數來複制S3存儲桶中的文件。所有的作品很好,直到我遇到需要被urlencoded的文件名(我無論如何都是urlencode)。當一個文件名以%字符結束時,copyObject()函數會吐出虛擬文件。在使用S3-> copyObject()時發生sprintf錯誤時出現問題並在其中使用%

例如 - 文件名63037_Copy%傳遞給copyObject()時,287%29ofDSC_1337.JPG引發以下錯誤 -

Warning: sprintf() [<a href='function.sprintf'>function.sprintf</a>]: Too few arguments in ..... S3.php on line 477 

這裏的copyObject功能線477

public static function copyObject($srcBucket, $srcUri, $bucket, $uri, $acl = self::ACL_PRIVATE, $metaHeaders = array(), $requestHeaders = array()) { 
    $rest = new S3Request('PUT', $bucket, $uri); 
    $rest->setHeader('Content-Length', 0); 
    foreach ($requestHeaders as $h => $v) $rest->setHeader($h, $v); 
    foreach ($metaHeaders as $h => $v) $rest->setAmzHeader('x-amz-meta-'.$h, $v); 
    $rest->setAmzHeader('x-amz-acl', $acl); 
    $rest->setAmzHeader('x-amz-copy-source', sprintf('/%s/%s', $srcBucket, $srcUri)); 
    if (sizeof($requestHeaders) > 0 || sizeof($metaHeaders) > 0) 
     $rest->setAmzHeader('x-amz-metadata-directive', 'REPLACE'); 
    $rest = $rest->getResponse(); 
    if ($rest->error === false && $rest->code !== 200) 
     $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); 
    if ($rest->error !== false) { 
-------------------------------------------- LINE 477 ---------------------------- 


     **trigger_error(sprintf("S3::copyObject({$srcBucket}, {$srcUri}, {$bucket}, {$uri}): [%s] %s", 
     $rest->error['code'], $rest->error['message']), E_USER_WARNING);** 


-------------------------------------------- LINE 477 ---------------------------- 

     return false; 
    } 
    return isset($rest->body->LastModified, $rest->body->ETag) ? array(
     'time' => strtotime((string)$rest->body->LastModified), 
     'hash' => substr((string)$rest->body->ETag, 1, -1) 
    ) : false; 
} 

有沒有人在此之前?當使用urlencoded時不改變的文件名時,絕對沒有問題,我已經嘗試從文件名中刪除所有空格,但不能夠捕獲所有字符,如括號,這是本例中的問題。無論如何,我不想沿着這條路走下去,因爲我想盡可能保持文件名儘可能接近原文。

謝謝你們

回答

1

重做線路是這樣的:

trigger_error("S3::copyObject({$srcBucket}, {$srcUri}, {$bucket}, {$uri}): ". sprintf("[%s] %s", 
     $rest->error['code'], $rest->error['message']), E_USER_WARNING); 

%的在第一個參數的sprintf被確定爲佔位符值。由於您的文件名首先插入到字符串中,然後該字符串被傳遞給sprintf(),sprintf()會錯誤地將文件名中的%解釋爲佔位符。

+0

謝謝,這可能是正確的答案,但我最終只是在上傳文件時對文件名執行str_replace,以避免這些問題一起出現。感謝您的回覆,問候。 – undefined 2010-07-28 12:52:15

相關問題