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:
{ "require": { "aws/aws-sdk-php": "2.*" } }
Após a criação e edição do arquivo de configuração, precisamos baixar as dependências, para isto rodamos o comando:
php composer.phar install
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 Amazon 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:
<?php session_start(); require "vendor/autoload.php"; ?> <!DOCTYPE html> <html> <head> <title>Example Upload to S3 in PHP</title> </head> <body> <?php if (isset($_SESSION['msg'])): echo $_SESSION['msg']; endif; ?> <h1>PHP Upload file to S3</h1> <form action="upload.php" method="post" enctype="multipart/form-data"> <input type="text" name="description" /> <input type="file" name="file" /> <input type="submit" value="Enviar"/> </body> </html>
Depois, é a vez de criar o arquivo upload.php, que será responsável por receber o POST com os dados e persistir diretamente no Amazon S3, observe que você precisará colocar o ACCESS_KEY e o SECRET_KEY da sua conta da AWS.
<?php define(ACCESS_KEY, ""); define(SECRET_KEY, ""); session_start(); require "vendor/autoload.php"; use Aws\S3\S3Client; try { // dispara exceção caso não tenha dados enviados if (!isset($_FILES['file'])) { throw new Exception("File not uploaded", 1); } // cria o objeto do cliente, necessita passar as credenciais da AWS $clientS3 = S3Client::factory(array( 'key' => ACCESS_KEY, 'secret' => SECRET_KEY )); // método putObject envia os dados pro bucket selecionado (no caso, teste-marcelo $response = $clientS3->putObject(array( 'Bucket' => "teste-marcelo", 'Key' => $_FILES['file']['name'], 'SourceFile' => $_FILES['file']['tmp_name'], )); $_SESSION['msg'] = "Objeto postado com sucesso, endereco <a href='{$response['ObjectURL']}'>{$response['ObjectURL']}</a>"; header("location: index.php"); } catch(Exception $e) { echo "Erro > {$e->getMessage()}"; } ?>
No final do upload, obtemos da resposta a URL do novo arquivo no Amazon 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.
Gostou do conteúdo? Tem alguma dúvida? Entre em contato com nossos Especialistas Mandic Cloud, ficamos felizes em ajudá-lo.