Upload pro S3: o mais simples possível em Php

amazon_s3

A grande maioria das aplicações ainda não faz os uploads para o S3, e este post faz parte da série que tenta mostrar a forma mais fácil possível de implementar isso em diferentes linguagens e tecnologias. Nele vamos mostrar o upload mais simples possível em Php. Para a versão TL;DR, simplesmente faça o fork do repositório e experimente localmente.

Para usar esta implementação, precisamos obter o SDK Php da Amazon, e você pode obtê-lo facilmente via Composer (Não sabe o que é composer? Recomendo parar tudo o que está fazendo e dedicar 60 minutos para leitura deste site), criando o arquivo composer.json na raiz do projeto com o seguinte conteúdo:

Após a criação e edição do arquivo de configuração, precisamos baixar as dependências, para isto rodamos o comando:

Note que foi criada uma pasta “vendor” com os pacotes do aws (na SDK da AWS vem algumas libs PHP juntas como o Guzzle e o Event Dispatcher do Symfony).

Pronto, resolvido as dependências, agora ficou muito fácil, no projeto há um formulário bem simples com encoding multipart/form-data (arquivo index.php), que submete para outro arquivo (upload.php) que recebe os dados e encaminha diretamente para o S3, sem passar pelo file system local. Estamos usando um bucket pré-existente, mas também poderia ser feita a criação de um novo bucket pela API.

Portanto, inicialmente cria-se o arquivo index.php contendo o formulário HTML:

index.php

Depois, é a vez de criar o arquivo upload.php, que será responsável por receber o POST com os dados e persistir diretamente no S3, observe que você precisará colocar o ACCESS_KEY e o SECRET_KEY da sua conta da AWS.

upload.php

No final do upload, obtemos da resposta a URL do novo arquivo no S3 e encaminhamos para os usuários. Pronto, seus arquivos agora estão sendo enviados para o S3 de forma bem simples e eficiente!

Quem quiser pegar o código fonte, está disponível no meu github.

  • Paulo Raponi

    Existe alguma forma de após enviar o arquivo, já mudar a permisão dele de Leitura para Everyone? Desta forma o arquivo já estaria disponivel para download/listagem

    • blpsilva

      Oi Paulo, tudo bem? É possível sim, da mesma forma que fizemos para Java também. Em Php, você precisaria usar no putObject uma opção adicional, definindo a ACL como public-read. Ficaria da seguinte forma no nosso exemplo:

      $clientS3->putObject(array(

      ‘ACL’ => “public-read”

      ‘Bucket’ => “teste-marcelo”,

      ‘Key’ => $_FILES[‘file’][‘name’],

      ‘SourceFile’ => $_FILES[‘file’][‘tmp_name’],

      ));

  • Paulo Trentin

    Boa noite Marcelo,
    seu post foi muito prático e útil para mim, obrigado!

  • http://aschavesdosucesso.com/ paulo robson

    gostei blog.rivendel ajudou aq a tirar algumas dúvidas, vlw

  • Nilson

    Estou errado ou nesse caso voxe fara o upload do arquivo da máquina local para se webserver e depois outro upload do webserver para o S3?

  • http://www.thierryrenewebdev.com/ Thierry Rene

    aqui o S3 não apresentava o arquivo, solicitava o download. para contornar, apenas adicionei a row ‘ContentType’ => ‘image’ na função putObject.

21