2012-11-22 5 views
1

La bibliothèque AWS php sdk 2.x a donc été déployée récemment et j'ai décidé de mettre à jour la version 1.5x. Ma première était de mettre à niveau ma classe de sauvegarde S3. J'ai rapidement rencontré une erreur:AWS PHP SDK Version 2 S3 putObject Erreur

Fatal error: Class 'EntityBody' not found in /usr/share/php/....my file here 

lorsque vous essayez de télécharger un fichier compressé dans un compartiment S3. J'ai écrit un cours pour abréger un peu l'écriture afin de permettre une sauvegarde multi-région, donc le code ci-dessous fait référence à $ this.

$response1 = $s3->create_object(
     $this->bucket_standard, 
     $this->filename, 
     array(
     'fileUpload' => $this->filename, 
     'encryption' => 'AES256', 
     //'acl'   => AmazonS3::ACL_PRIVATE, 
     'contentType' => 'text/plain', 
     'storage'  => AmazonS3::STORAGE_REDUCED, 
     'headers'  => array(// raw headers 
           'Cache-Control' => 'max-age', 
           //'Content-Encoding' => 'gzip', 
           'Content-Language' => 'en-US' 
           //'Expires'  => 'Thu, 01 Nov 2012 16:00:00 GMT' 
          ), 
      'meta'  => array(
           'param1' => $this->backupDateTime->format('Y-m-d H:i:s'),  // put some info on the file in meta tags 
           'param2' => $this->hostOrigin 
          ) 
      ) 
    ); 

Ce qui précède a bien fonctionné sur 1.5.x.

Maintenant, 2.x, je suis à la recherche dans leurs documents et ils ont changé à peu près tout (grand ... sarcasme au maximum)

$s3opts=array('key'=> $this->accessKey, 'secret' => $this->secretKey,'region' => 'us-east-1'); 
$s3 = Aws\S3\S3Client::factory($s3opts); 

maintenant j'ai une nouvelle S3 objet. Et voici ma syntaxe 2.x pour faire exactement la même chose. Mon problème se pose où ils ont (sinistrement) changé le vieux "fileupload" en "Corps" et l'ont rendu plus abstrait dans la façon d'attacher un fichier! J'ai essayé les deux et je pense que cela a à voir avec les dépendances (Guzzle ou Smyfony etc.), mais j'obtiens l'erreur ci-dessus (ou substituez Stream si vous voulez) chaque fois que j'essaye d'exécuter ceci.

J'ai essayé d'utiliser Composer avec composer.json, et le aws.phar mais avant d'entrer dans ce domaine, y at-il quelque chose de stupide qui me manque?

$response1 = $s3->putObject(array(
     'Bucket' => $this->bucket_standard, 
     'Key' => $this->filename, 
     'ServerSideEncryption' => 'AES256', 
     'StorageClass' => 'REDUCED_REDUNDANCY', 
     'Body' => EntityBody::factory(fopen($this->filename, 'r')), 
     //'Body' => new Stream(fopen($fullPath, 'r')), 

     'MetaData' => array(
           'BackupTime' => $this->backupDateTime->format('Y-m-d H:i:s'),  // put some info on the file in meta tags 
           'HostOrigin' => $this->hostOrigin 
          ) 
    )); 

Merci comme toujours,

R

Répondre

6

Avez-vous importer le EntityBody dans votre espace de noms?

use Guzzle\Http\EntityBody; 

Sinon, vous auriez à faire

'Body' => \Guzzle\Http\EntityBody::factory(fopen($this->filename, 'r')), 
+0

Merci Jeremy - namespaces toujours pas sauter sur mon radar de débogage immédiatement encore. – Ross

+0

Pas de problème. Si vous commencez simplement à utiliser des espaces de noms, il faut s'y habituer un peu. Ce sera bientôt une seconde nature. –

Questions connexes