2010-07-27 16 views
0

J'utilise la classe PHP S3.PHP pour gérer les fichiers sur Amazon S3. J'utilise la fonction copyObject() pour copier des fichiers dans mon compartiment S3. Tout fonctionne bien jusqu'à ce que je rencontre des noms de fichiers qui ont besoin d'être encodés (j'utilise tout de toute façon). Quand un nom de fichier se termine par% caractères, la fonction copyObject() crache le mannequin.Problème avec l'erreur sprintf lors de l'utilisation S3-> copyObject() et les noms de fichiers avec% en eux

par exemple - le nom du fichier 63037_Copy% 287% 29ofDSC_1337.JPG jette l'erreur suivante lorsqu'il est passé à CopyObject() -

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

est ici la ligne de fonction 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; 
} 

Quelqu'un at-il à travers cela avant? Il n'y a absolument aucun problème quand on utilise des noms de fichiers qui ne changent pas à l'urlencoded, et j'ai déjà essayé de supprimer tous les espaces des noms de fichiers mais je ne peux pas attraper tous les caractères, comme les parenthèses. Et je ne veux pas aller sur cette route de toute façon que je veux garder les noms de fichiers aussi proches de l'original que possible.

merci les gars

Répondre

1

Refaire la ligne de cette façon:

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

% s 'dans le premier paramètre à sprintf sont identifiés comme les espaces réservés pour les valeurs. Parce que vos noms de fichiers sont d'abord insérés dans la chaîne et que cette chaîne est ensuite passée à sprintf(), sprintf() interprète par erreur les% dans les noms de fichiers comme des espaces réservés.

+0

Merci, cela peut avoir été la bonne réponse, mais j'ai fini par faire un str_replace sur le nom de fichier quand il a été téléchargé pour éviter ce problème tous ensemble. Merci pour votre réponse, salutations. – undefined