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

Amazon S3 PHP upload

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:

index.php

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

upload.php

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