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. ?>

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


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