Lançado Adianti Framework 7.6!
Clique aqui para saber mais
Download Amazon s3 Olá Colegas, Estou tendo dificuldades em fazer download de arquivos da amazon s3. Obtenho o result, mas na hora e enviar para o navegador, nada acontece. Alguém já conseguiu implementar? Veja o meu código abaixo, usando parte do exemplo da Amazon: ...
MG
Download Amazon s3  
Olá Colegas,

Estou tendo dificuldades em fazer download de arquivos da amazon s3.

Obtenho o result, mas na hora e enviar para o navegador, nada acontece.

Alguém já conseguiu implementar?

Veja o meu código abaixo, usando parte do exemplo da Amazon:

  1. <?php
  2.     ...
  3.     $filename $doc->url;
  4.     $result $s3->getObject([
  5.               'Bucket' => $bucket,
  6.                'Key' => $filename,
  7.      ]);
  8.     header("Content-Type: {$result['ContentType']}");
  9.     echo $result['Body'];
  10.      ....
  11. ?>

Pacotão Dominando o Adianti Framework 7
O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado! Versão 7.4


Dominando o Adianti 7 Quero me inscrever agora!

Comentários (14)


MG

Resolvido. Usei "Stream Wrapper" da AWS.

https://docs.aws.amazon.com/pt_br/sdk-for-php/v3/developer-guide/s3-stream-wrapper.html
LB

Amigo Marcelo, pode dar um norte de como fez o formulário de upload para o S3?
MG

Boa tarde Leonardo,

Primeiro é preciso instalar o SDK da Amazon.

O procedimento ocorre no método onSave. Quando você usa TFile, o FW faz o envio em primeiro lugar para a posta "tmp".

Baseado nisso, basta ter o "target_file" que é basicamente $target_file = "rmp/".$data->nome_arquivo.

Um exemplo

  1. <?php
  2. use Aws\S3\S3Client// deve ser declarado no começo da sua class, depois de instalada o SDK
  3.     public function onSave($param)
  4.     {
  5.         // instancia o s3 - $credentiasl ver documentacao do S3
  6.         $s3 = new S3Client([
  7.                     'version' => 'latest',
  8.                     'region'  => 'sa-east-1',
  9.                     'credentials' => [
  10.                       'key'     => $credentials['key'],
  11.                       'secret'  => $credentials['secret']
  12.                     ]
  13.                 ]);
  14.     // envia o arquivo para o S3
  15.     $file_name $data->arquivo;
  16.     $bucket "meus_bucket"// ver doc sdk
  17.      $response $s3->putObject(array(
  18.                            'Bucket'     => $bucket,
  19.                             'Key'        => $file_name,
  20.                             'SourceFile' => $target_file,
  21.                         ));
  22.     }
  23. ?>
LB

Valeu Marcelo,
Obrigado pela ajuda.
FT

Olá Marcelo, você pode dar mais detalhes de como você instalou o sdk da amazon? Instalei via composer na raiz do template do framework, mas quando vou usar o "use AwsS3S3Client;" na classe, ele dá um erro estranho:

Fatal error: ProvaAnexoForm cannot use AwsS3S3Client - it is not a trait in /var/www/html/portalprovas/portal/app/control/provas_questoes/ProvaAnexoForm.class.php on line 14
MG

Olá, vamos algumas verificações:

1) Após o composer, veje se o pacote foi instalado corretamente em "vence/aws";
2) Após a abertura do arquivo .php, deve-se usar o caminho correto da classe, conforme abaixo:

  1. <?php
  2. use Aws\S3\S3Client;
  3. ?>


MG

Ops....
Diretório de instalação do pacote
vendor/aws
MG

Se possível, postar o código fonte...
FT

Olá Marcelo, muito obrigado pela ajuda! O problema era o local em que eu estava colocando o "use...": na vdd ele deve ser colocado antes da criação da classe:
  1. <?php
  2. use Aws\S3\S3Client;
  3. class ProvaAnexoForm extends TPage
  4. {
  5. (...)
  6. </code>
MG

Sim, sempre antes da criação da classe.
Sucesso!
GO

Olá Marcelo!
Como você conseguiu resolver os conflitos de pacotes ao rodar "composer require aws/aws-sdk-php" ?
Não estou conseguindo resolver o conflito com o pacote guzzlehttp/guzzle.
MG

Geovani
Eu não tive este problema.
Talvez seja melhor criar um tópico para que os colegas possam ajudar!
FL

Marcelo, poderia compartilhar a forma que vc utilizou para exibir ou fazer o download de arquivos salvos no s3?
MG

Francisco, segue o método implementado:

  1. <?php
  2.    /**
  3.      * Baixar o documento
  4.      */
  5.     public function onDownload($param)
  6.     {
  7.         try {
  8.             // instancia s3
  9.             $bucket 'bazzaproducoes';
  10.             $cred Credenciais::getCredentials();
  11.             
  12.             // conectar
  13.             $s3 = new S3Client([
  14.                 'version' => 'latest',
  15.                 'region'  => 'sa-east-1',
  16.                 'credentials' => [
  17.                   'key'     => $cred['key'],
  18.                   'secret'  => $cred['secret']
  19.                 ]
  20.             ]);           
  21.         
  22.         
  23.             TTransaction::open('app');
  24.             $id $param['key'];
  25.             $data $this->form->getData();
  26.             $doc Documentos::find($id);
  27.             if (!empty($doc)) {
  28.                 //$filename = $doc->nome_arquivo;
  29.                 $filename =  $doc->key_S3;
  30.                 $arq fopen('tmp/'.$doc->nome_arquivo,'w+');
  31.                 
  32.                 $s3->registerStreamWrapper();
  33.                 $dir "s3://$bucket/$filename";
  34.                 if ($stream fopen($dir'r')) {
  35.                     // While the stream is still open
  36.                     while (!feof($stream)) {
  37.                         // Read 1,024 bytes from the stream
  38.                         $content fread($stream1024);
  39.                         fwrite($arq$content);
  40.                     }
  41.                     // Be sure to close the stream resource when you're done with it
  42.                     fclose($stream);
  43.                     fclose($arq);
  44.                 }                 
  45.                 //TPage::openFile('tmp/'.$doc->arquivo);
  46.                 $doc_file 'tmp/'.$doc->nome_arquivo;
  47.                 TPage::openFile($doc_file);
  48.                 
  49.             } else {
  50.                 new TMessage('error''Documento não encontrado');
  51.                 return;
  52.             }
  53.             
  54.             $obj = new stdClass;
  55.             $obj->registro  $doc->registro;
  56.             $obj->origem    $doc->origem;
  57.             $obj->descricao ='';
  58.             $obj->file      '';
  59.             $this->form->setData($obj);
  60.             
  61.             TTransaction::close();
  62.             $par = ['key' => $doc->id];
  63.             $this->onReload($par);
  64.         } catch (Exception $e) {
  65.             $msg ExceptionService::getMessageFull(__CLASS__'onDownload',$e);
  66.             $this->log->logError($msg);
  67.             new TMessage('error'$e->getMessage());
  68.         }
  69.      }
  70.     
  71. ?>