2015-07-10 19 views
5

Podążyłem tymi kodami do partii PutObject do S3. Korzystam z najnowszego pakietu PHP SDK (3.x). Ale ja dostaję:S3 Błąd przesyłania wsadowego/równoległego z PHP SDK

Argument 1 przekazany do AWS \ AwsClient :: execute() musi implementować interfejs AWS \ CommandInterface, tablica podane

$commands = array(); 
$commands[] = $s3->getCommand('PutObject', array(
    'Bucket' => $bucket, 
    'Key' => 'images/1.jpg', 
    'Body' => base64_decode('xxx'), 
    'ACL' => 'public-read', 
    'ContentType' => 'image/jpeg' 
)); 

$commands[] = $s3->getCommand('PutObject', array(
    'Bucket' => $bucket, 
    'Key' => 'images/2.jpg', 
    'Body' => base64_decode('xxx'), 
    'ACL' => 'public-read', 
    'ContentType' => 'image/jpeg' 
)); 

// Execute the commands in parallel 
$s3->execute($commands); 

Odpowiedz

4

Jeśli używasz nowoczesnej wersji SDK, spróbuj zamiast tego zbudować polecenie w ten sposób. Zrobione prosto z docs; to powinno działać. Nazywa się to metodą "łańcuchowania".

$commands = array(); 


$commands[] = $s3->getCommand('PutObject') 
       ->set('Bucket', $bucket) 
       ->set('Key', 'images/1.jpg') 
       ->set('Body', base64_decode('xxx')) 
       ->set('ACL', 'public-read') 
       ->set('ContentType', 'image/jpeg'); 

$commands[] = $s3->getCommand('PutObject') 
       ->set('Bucket', $bucket) 
       ->set('Key', 'images/2.jpg') 
       ->set('Body', base64_decode('xxx')) 
       ->set('ACL', 'public-read') 
       ->set('ContentType', 'image/jpeg'); 

// Execute the commands in parallel 
$s3->execute($commands); 

// Loop over the commands, which have now all been executed 
foreach ($commands as $command) 
{ 
    $result = $command->getResult(); 

    // Use the result. 
} 

Upewnij się, że używasz najnowszej wersji zestawu SDK.

Edit

Wydaje się, że SDK API zmieniła się znacząco w wersji 3.x. Powyższy przykład powinien działać poprawnie w wersji 2.x pakietu AWS SDK. Dla 3.x, trzeba użyć CommandPool() s i promise():

$commands = array(); 

$commands[] = $s3->getCommand('PutObject', array(
    'Bucket' => $bucket, 
    'Key' => 'images/1.jpg', 
    'Body' => base64_decode ('xxx'), 
    'ACL' => 'public-read', 
    'ContentType' => 'image/jpeg' 
)); 
$commands[] = $s3->getCommand('PutObject', array(
    'Bucket' => $bucket, 
    'Key' => 'images/2.jpg', 
    'Body' => base64_decode ('xxx'), 
    'ACL' => 'public-read', 
    'ContentType' => 'image/jpeg' 
)); 


$pool = new CommandPool($s3, $commands); 

// Initiate the pool transfers 
$promise = $pool->promise(); 

// Force the pool to complete synchronously 
try { 
    $result = $promise->wait(); 
} catch (AwsException $e) { 
    // handle the error. 
} 

Następnie $result powinien być tablicą wyników poleceń.

+0

Czy to nie to samo co kodowałem? Błąd kończy się niepowodzeniem przy $ s3-> execute ($ commands); – twb

+0

Różnica polega na użyciu '-> set()' łańcuchowania zamiast 'array()' parametrów. Jakiej wersji używasz? – Will

+0

Nie działa. Korzystanie z ## 3.0.4 - 2015-06-11. Wywołanie niezdefiniowanej metody Aws \ Command :: set() – twb