我正在使用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時不改變的文件名時,絕對沒有問題,我已經嘗試從文件名中刪除所有空格,但不能夠捕獲所有字符,如括號,這是本例中的問題。無論如何,我不想沿着這條路走下去,因爲我想盡可能保持文件名儘可能接近原文。
謝謝你們
謝謝,這可能是正確的答案,但我最終只是在上傳文件時對文件名執行str_replace,以避免這些問題一起出現。感謝您的回覆,問候。 – undefined 2010-07-28 12:52:15