Проблема с ошибкой sprintf при использовании S3-> copyObject () и имен файлов с% в них - PullRequest
0 голосов
/ 27 июля 2010

Я использую класс PHP S3.PHP для управления файлами в Amazon S3.Я использую функцию copyObject (), чтобы копировать файлы в моем контейнере S3.Все прекрасно работает, пока я не встречаю имена файлов, которые нужно кодировать (я все равно кодирую).Когда имя файла заканчивается символом%, функция copyObject () выплевывает пустышку.

например - имя файла 63037_Copy% 287% 29ofDSC_1337.JPG выдает следующую ошибку при передаче в copyObject () -

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;
}

Кто-нибудь сталкивался с этим раньше?Нет абсолютно никаких проблем при использовании имен файлов, которые не изменяются при кодировании urlen, и я уже пытался удалить все пробелы из имен файлов, но не смог перехватить все символы, такие как скобки, что является проблемой в приведенном здесь примере.И я все равно не хочу идти по этому пути, поскольку хочу, чтобы имена файлов были как можно ближе к оригиналу.

спасибо, ребята

1 Ответ

1 голос
/ 27 июля 2010

Повтор строки таким образом:

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

% в первом параметре sprintf идентифицируются как заполнители для значений. Поскольку ваши имена файлов сначала вставляются в строку, а затем эта строка передается sprintf (), sprintf () по ошибке интерпретирует% в именах файлов как заполнители.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...