As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Usando uploads de várias partes do Amazon S3 com a versão 3 AWS SDK for PHP
Com uma única operação PutObject
, você pode fazer upload de objetos de até 5 GB. No entanto, usando os métodos de multipart upload (por exemplo CreateMultipartUpload
, UploadPart
, CompleteMultipartUpload
, AbortMultipartUpload
), você pode fazer upload de objetos de 5 MB a 5 TB.
O exemplo a seguir mostra como:
-
Faça upload de um objeto para o Amazon S3, usando. ObjectUploader
-
Crie um upload de várias partes para um objeto do Amazon S3 usando o. MultipartUploader
-
Copie objetos de um local do Amazon S3 para outro usando. ObjectCopier
Todo o código de exemplo do AWS SDK for PHP está disponível aqui em GitHub
Credenciais
Antes de executar o código de exemplo, configure suas AWS credenciais, conforme descrito emCredenciais. Em seguida, importe o AWS SDK for PHP, conforme descrito emUso básico.
Uploader de objeto
Se você não tem certeza se PutObject
ou MultipartUploader
é melhor para a tarefa, use ObjectUploader
. O ObjectUploader
fará upload de um arquivo grande no Amazon S3 usando PutObject
ou MultipartUploader
, dependendo do que for melhor com base no tamanho da carga.
require 'vendor/autoload.php'; use Aws\Exception\MultipartUploadException; use Aws\S3\MultipartUploader; use Aws\S3\ObjectUploader; use Aws\S3\S3Client;
Código de exemplo
// Create an S3Client. $s3Client = new S3Client([ 'profile' => 'default', 'region' => 'us-east-2', 'version' => '2006-03-01' ]); $bucket = 'your-bucket'; $key = 'my-file.zip'; // Use a stream instead of a file path. $source = fopen('/path/to/large/file.zip', 'rb'); $uploader = new ObjectUploader( $s3Client, $bucket, $key, $source ); do { try { $result = $uploader->upload(); if ($result["@metadata"]["statusCode"] == '200') { print('<p>File successfully uploaded to ' . $result["ObjectURL"] . '.</p>'); } print($result); // If the SDK chooses a multipart upload, try again if there is an exception. // Unlike PutObject calls, multipart upload calls are not automatically retried. } catch (MultipartUploadException $e) { rewind($source); $uploader = new MultipartUploader($s3Client, $source, [ 'state' => $e->getState(), ]); } } while (!isset($result)); fclose($source);
Configuração
O construtor do objeto ObjectUploader
aceita os seguintes argumentos:
$client
-
O objeto
Aws\ClientInterface
a ser usado para executar as transferências. Deve ser uma instância deAws\S3\S3Client
. $bucket
-
(
string
, obrigatório) Nome do bucket para o qual o objeto está sendo enviado. $key
-
(
string
, obrigatório) Chave a ser usada para o objeto que está sendo enviado. $body
-
(
mixed
, obrigatório) Dados do objeto a serem carregados. Pode ser umStreamInterface
recurso de PHP fluxo ou uma sequência de dados a ser carregada. $acl
-
(
string
) Lista de controle de acesso (ACL) a ser definida no objeto que está sendo carregado. Por padrão, os objetos são privados. $options
-
Uma matriz associativa de opções de configuração para o multipart upload. As seguintes opções de configuração são válidas:
add_content_md5
-
(
bool
) Defina como verdadeiro para calcular automaticamente a MD5 soma de verificação do upload. mup_threshold
-
(
int
, padrão:int(16777216)
) O número de bytes para o tamanho do arquivo. Se o tamanho do arquivo exceder esse limite, será usado um carregamento fracionado. before_complete
-
(
callable
) Retorno de chamada a ser invocado antes da operaçãoCompleteMultipartUpload
. O retorno de chamada deve ter uma assinatura de função similar a:function (Aws\Command $command) {...}
. Veja a CompleteMultipartUpload APIreferência dos parâmetros que você pode adicionar aoCommandInterface
objeto. before_initiate
-
(
callable
) Retorno de chamada a ser invocado antes da operaçãoCreateMultipartUpload
. O retorno de chamada deve ter uma assinatura de função similar a:function (Aws\Command $command) {...}
. O SDK invoca esse retorno de chamada se o tamanho do arquivo exceder o valor.mup_threshold
Veja a CreateMultipartUpload APIreferência dos parâmetros que você pode adicionar aoCommandInterface
objeto. before_upload
-
(
callable
) Retorno de chamada a ser invocado antes de qualquer operaçãoPutObject
ouUploadPart
. O retorno de chamada deve ter uma assinatura de função similar a:function (Aws\Command $command) {...}
. O SDK invoca esse retorno de chamada se o tamanho do arquivo for menor ou igual ao valor.mup_threshold
Consulte a PutObject APIreferência dos parâmetros que você pode aplicar àPutObject
solicitação. Para os parâmetros que se aplicam a umaUploadPart
solicitação, consulte a UploadPart APIreferência. O SDK ignora qualquer parâmetro que não seja aplicável à operação representada peloCommandInterface
objeto. concurrency
-
(
int
, padrão:int(3)
) O número máximo de operaçõesUploadPart
simultâneas permitidas durante o multipart upload. part_size
-
(
int
, padrão:int(5242880)
) Tamanho da parte, em bytes, a ser usado ao fazer um multipart upload. Esse valor deve ser de 5 MB a 5 GB, inclusive. state
-
(
Aws\Multipart\UploadState
) Um objeto que representa o estado do multipart upload e que é usado para retomar um upload anterior. Quando essa opção for fornecida, os argumentos$bucket
e$key
e a opçãopart_size
serão ignoradas.
MultipartUploader
Os multipart uploads são projetados para melhorar a experiência de upload de objetos maiores. Eles permitem fazer upload de objetos em partes independentemente, em qualquer ordem e em paralelo.
Os clientes do Amazon S3 são incentivados a usar os carregamentos fracionados para objetos maiores que 100 MB.
MultipartUploader objeto
SDKTem um MultipartUploader
objeto especial que simplifica o processo de upload de várias partes.
Importações
require 'vendor/autoload.php'; use Aws\Exception\MultipartUploadException; use Aws\S3\MultipartUploader; use Aws\S3\S3Client;
Código de exemplo
$s3Client = new S3Client([ 'profile' => 'default', 'region' => 'us-west-2', 'version' => '2006-03-01' ]); // Use multipart upload $source = '/path/to/large/file.zip'; $uploader = new MultipartUploader($s3Client, $source, [ 'bucket' => 'your-bucket', 'key' => 'my-file.zip', ]); try { $result = $uploader->upload(); echo "Upload complete: {$result['ObjectURL']}\n"; } catch (MultipartUploadException $e) { echo $e->getMessage() . "\n"; }
O carregador cria um gerador de dados da parte, com base na origem fornecida e na configuração e tenta fazer upload de todas as partes. Se houver falha em alguma parte do upload, o uploader continuará a fazer upload das partes até que todos os dados de origem tenham sido lidos. Posteriormente, o uploader tentará novamente fazer upload das partes com falha ou lançará uma exceção que contém informações sobre as partes com falha de upload.
Personalização de um carregamento fracionado
Você pode definir opções personalizadas nas operações CreateMultipartUpload
, UploadPart
e CompleteMultipartUpload
executadas pelo multipart uploader por meio de retornos de chamada passados para o construtor.
Importações
require 'vendor/autoload.php'; use Aws\S3\MultipartUploader; use Aws\S3\S3Client;
Código de exemplo
// Create an S3Client $s3Client = new S3Client([ 'profile' => 'default', 'region' => 'us-west-2', 'version' => '2006-03-01' ]); // Customizing a multipart upload $source = '/path/to/large/file.zip'; $uploader = new MultipartUploader($s3Client, $source, [ 'bucket' => 'your-bucket', 'key' => 'my-file.zip', 'before_initiate' => function (Command $command) { // $command is a CreateMultipartUpload operation $command['CacheControl'] = 'max-age=3600'; }, 'before_upload' => function (Command $command) { // $command is an UploadPart operation $command['RequestPayer'] = 'requester'; }, 'before_complete' => function (Command $command) { // $command is a CompleteMultipartUpload operation $command['RequestPayer'] = 'requester'; }, ]);
Coleta de resíduos manual entre carregamentos de partes
Se você estiver atingindo o limite de memória com carregamentos grandes, isso pode ser devido a referências cíclicas geradas por ainda SDK não terem sido coletadas pelo coletor de PHP lixo
$uploader = new MultipartUploader($client, $source, [ 'bucket' => 'your-bucket', 'key' => 'your-key', 'before_upload' => function(\Aws\Command $command) { gc_collect_cycles(); } ]);
Recuperação de erros
Quando ocorre um erro durante o processo de multipart upload, é lançada uma MultipartUploadException
. Essa exceção fornece acesso ao objeto UploadState
, que contém informações sobre o andamento do multipart upload. O UploadState
pode ser usado para retomar um upload que não foi concluído.
Importações
require 'vendor/autoload.php'; use Aws\Exception\MultipartUploadException; use Aws\S3\MultipartUploader; use Aws\S3\S3Client;
Código de exemplo
// Create an S3Client $s3Client = new S3Client([ 'profile' => 'default', 'region' => 'us-west-2', 'version' => '2006-03-01' ]); $source = '/path/to/large/file.zip'; $uploader = new MultipartUploader($s3Client, $source, [ 'bucket' => 'your-bucket', 'key' => 'my-file.zip', ]); //Recover from errors do { try { $result = $uploader->upload(); } catch (MultipartUploadException $e) { $uploader = new MultipartUploader($s3Client, $source, [ 'state' => $e->getState(), ]); } } while (!isset($result)); //Abort a multipart upload if failed try { $result = $uploader->upload(); } catch (MultipartUploadException $e) { // State contains the "Bucket", "Key", and "UploadId" $params = $e->getState()->getId(); $result = $s3Client->abortMultipartUpload($params); }
A retomada de um upload de um UploadState
tenta fazer upload das partes que ainda não foram obtidas por upload. O objeto de estado rastreia a partes ausentes, mesmo que sejam consecutivas. O uploader lê ou procura no arquivo de origem fornecido os intervalos de bytes que pertencem às partes que ainda precisam ser obtidas por upload.
Os objetos UploadState
são serializáveis, portanto, você também pode retomar um upload em um outro processo. Você também pode obter o objeto UploadState
, mesmo quando não estiver tratando de uma exceção, chamando $uploader->getState()
.
Importante
Streams passados como uma origem para um MultipartUploader
não são automaticamente retrocedidos antes do upload. Se estiver usando um stream em vez de um caminho de arquivo em um loop semelhante ao exemplo anterior, será necessário redefinir a variável $source
dentro do bloco catch
.
Importações
require 'vendor/autoload.php'; use Aws\Exception\MultipartUploadException; use Aws\S3\MultipartUploader; use Aws\S3\S3Client;
Código de exemplo
// Create an S3Client $s3Client = new S3Client([ 'profile' => 'default', 'region' => 'us-west-2', 'version' => '2006-03-01' ]); //Using stream instead of file path $source = fopen('/path/to/large/file.zip', 'rb'); $uploader = new MultipartUploader($s3Client, $source, [ 'bucket' => 'your-bucket', 'key' => 'my-file.zip', ]); do { try { $result = $uploader->upload(); } catch (MultipartUploadException $e) { rewind($source); $uploader = new MultipartUploader($s3Client, $source, [ 'state' => $e->getState(), ]); } } while (!isset($result)); fclose($source);
Abortar um multipart upload
Um multipart upload pode ser anulado recuperando o UploadId
contido no objeto UploadState
e passando-o para abortMultipartUpload
.
try { $result = $uploader->upload(); } catch (MultipartUploadException $e) { // State contains the "Bucket", "Key", and "UploadId" $params = $e->getState()->getId(); $result = $s3Client->abortMultipartUpload($params); }
Carregamentos fracionados assíncronos
Chamar upload()
no MultipartUploader
é uma solicitação de bloqueio. Se estiver trabalhando em um contexto assíncrono, você poderá obter uma promessa para o multipart upload.
require 'vendor/autoload.php'; use Aws\S3\MultipartUploader; use Aws\S3\S3Client;
Código de exemplo
// Create an S3Client $s3Client = new S3Client([ 'profile' => 'default', 'region' => 'us-west-2', 'version' => '2006-03-01' ]); $source = '/path/to/large/file.zip'; $uploader = new MultipartUploader($s3Client, $source, [ 'bucket' => 'your-bucket', 'key' => 'my-file.zip', ]); $promise = $uploader->promise();
Configuração
O construtor do objeto MultipartUploader
aceita os seguintes argumentos:
-
$client
-
O objeto
Aws\ClientInterface
a ser usado para executar as transferências. Deve ser uma instância deAws\S3\S3Client
. -
$source
-
A origem dos dados que estão sendo carregados. Isso pode ser um caminho ou URL (por exemplo,
/path/to/file.jpg
), um identificador de recurso (por exemplo,fopen('/path/to/file.jpg', 'r)
) ou uma instância de um fluxo PSR -7. -
$config
-
Uma matriz associativa de opções de configuração para o multipart upload.
As seguintes opções de configuração são válidas:
-
acl
-
(
string
) Lista de controle de acesso (ACL) a ser definida no objeto que está sendo carregado. Por padrão, os objetos são privados. -
before_complete
-
(
callable
) Retorno de chamada a ser invocado antes da operaçãoCompleteMultipartUpload
. O retorno de chamada deve ter uma assinatura de função comofunction (Aws\Command $command) {...}
. -
before_initiate
-
(
callable
) Retorno de chamada a ser invocado antes da operaçãoCreateMultipartUpload
. O retorno de chamada deve ter uma assinatura de função comofunction (Aws\Command $command) {...}
. -
before_upload
-
(
callable
) Retorno de chamada a ser invocado antes de qualquer operaçãoUploadPart
. O retorno de chamada deve ter uma assinatura de função comofunction (Aws\Command $command) {...}
. -
bucket
-
(
string
, obrigatório) Nome do bucket para o qual o objeto está sendo enviado. -
concurrency
-
(
int
, padrão:int(5)
) O número máximo de operaçõesUploadPart
simultâneas permitidas durante o multipart upload. -
key
-
(
string
, obrigatório) Chave a ser usada para o objeto que está sendo enviado. -
part_size
-
(
int
, padrão:int(5242880)
) Tamanho da parte, em bytes, a ser usado ao fazer um multipart upload. Esse tamanho deve ser de 5 MB a 5 GB, inclusive. -
state
-
(
Aws\Multipart\UploadState
) Um objeto que representa o estado do multipart upload e que é usado para retomar um upload anterior. Quando essa opção for fornecida, as opçõesbucket
,key
epart_size
serão ignoradas. add_content_md5
-
(
boolean
) Defina como verdadeiro para calcular automaticamente a MD5 soma de verificação do upload.
-
Cópias de várias partes
Isso AWS SDK for PHP também inclui um MultipartCopy
objeto que é usado de forma semelhante aoMultipartUploader
, mas foi projetado para copiar objetos entre 5 GB e 5 TB de tamanho no Amazon S3.
require 'vendor/autoload.php'; use Aws\Exception\MultipartUploadException; use Aws\S3\MultipartCopy; use Aws\S3\S3Client;
Código de exemplo
// Create an S3Client $s3Client = new S3Client([ 'profile' => 'default', 'region' => 'us-west-2', 'version' => '2006-03-01' ]); //Copy objects within S3 $copier = new MultipartCopy($s3Client, '/bucket/key?versionId=foo', [ 'bucket' => 'your-bucket', 'key' => 'my-file.zip', ]); try { $result = $copier->copy(); echo "Copy complete: {$result['ObjectURL']}\n"; } catch (MultipartUploadException $e) { echo $e->getMessage() . "\n"; }