Upload de arquivos com DropzoneJS e PHP

Aprenda neste artigo como construir um componente de upload de arquivos com DropzoneJS em PHP.

Motivação

É bem sabido na comunidade de desenvolvedores a importância de disponibilizar os recursos de download e upload de arquivos de forma fácil e intuitiva. Nesse quesito, diversos são os frameworks que visam simplificar nossa vida, abstraindo boa parte da implementação de código HTML, JavaScript e CSS que teríamos de escrever para criar recursos mais robustos e completos. Entretanto, a maioria deles falha no quesito usabilidade quando, por exemplo, não viabiliza funções de “arrastar e soltar”, status do upload (como barras de progresso), sistemas de feedback com mensagens de validação/erro/sucesso, dentre outras.

Este artigo visa expor rapidamente os benefícios que tais frameworks nos trazem através da construção de uma mini aplicação que faz o upload de imagens para um diretório qualquer, usando o framework JavaScript DropzoneJS em conjunto com o PHP como linguagem de servidor.

Passo 1: Instalando o DropzoneJS

O DropzoneJS é uma biblioteca open source que implementa o recurso de upload de arquivos via drag and drop. Ela é leve, não depende de outras bibliotecas JavaScript e, ao lidar com arquivos de imagens, ainda fornece a opção de pré-visualizar as mesmas.

Para efetuar a sua instalação, baixe os arquivos JavaScript e CSS do DropzoneJS no GitHub e importe-os na página HTML através do seguinte código:

<link rel="stylesheet" href="dropzone.css" /> <script src="dropzone.js"></script>

Para fins de padronização e performance, opte por carregar seus arquivos CSS dentro do cabeçalho HTML, e os arquivos JavaScript após o corpo da página.

Quando esse código for executado no navegador, teremos o DropzoneJS importado e acessível via objeto JavaScript window.Dropzone, bem como disponibilizados os estilos que acompanham o framework.

Observação: Um ponto importante a saber é que o DropzoneJS não efetua o upload dos arquivos no lado do servidor. Ele serve apenas como uma ponte entre a interface do usuário construída em HTML e a aplicação web dinâmica que recebe os referidos arquivos. Logo, é você que deverá implementar o código destinado a armazenar os arquivos utilizando a linguagem de sua preferência. Nesse artigo optamos pelo PHP.

Passo 2: Criando a classe dropzone

Nosso próximo passo é a criação do elemento de formulário que lidará com a seleção e envio dos arquivos. Nele, adicionaremos a classe dropzone que incutirá o estilo característico do framework:

<form action="upload.php" class="dropzone" id="meuPrimeiroDropzone"> </form>

Além do estilo, essa classe também permite que o DropzoneJS inicialize todos os seus eventos de upload e os atrele ao respectivo formulário. Assim, quando efetuarmos um submit no form, todos os arquivos selecionados serão enviados via request para o endereço registrado no atributo action.

Você também pode ter o mecanismo de upload de arquivos sem o uso de JavaScript, utilizando o processo de fallback. Para isso, precisamos incluir a classe fallback no HTML, de preferência em uma div interna, a qual o DropzoneJS remove quando a página é carregada no navegador. Vejamos como criá-la na Listagem 1.

1 <form action="upload.php" class="dropzone" id="meuPrimeiroDropzone"> 2 <div class="fallback"> 3 <input name="fileToUpload" type="file" multiple /> 4 </div> 5 </form>
Listagem 1. Adicionando a classe fallback dentro do formulário

Passo 3: Usando o DropzoneJS programaticamente

Uma opção à importação do DropzoneJS via tag <script> é habilitá-lo programaticamente, instanciando a classe dropzone no JavaScript, conforme o código:

var meuDropzone = new Dropzone("div#meuId", {url: "upload.php"});

O nível de integração do DropzoneJS se estende, inclusive, a outros frameworks JavaScript mais comuns, como é o caso do jQuery. Para habilitá-lo com os seletores jQuery, basta usar o seguinte código:

$("div#meuId").dropzone({ url: "upload.php" });

A propriedade url, conforme observado, se torna obrigatória no modelo programático, uma vez que não temos uma tag de formulário com o atributo action especificado para determinar o destino dos arquivos selecionados.

Passo 4: Configurando o upload de arquivos

Uma outra maneira de configurar o upload de arquivos programaticamente é setando a propriedade options do objeto Dropzone. No fim das contas, essa propriedade funciona como uma lista com os ids de todos os formulários da página que contenham a classe dropzone. Cada configuração, por sua vez, é individual e deve ser feita separadamente no caso de termos vários formulários de upload no mesmo HTML.

Vejamos como podemos fazer isso na Listagem 2.

1 Dropzone.options.meuPrimeiroDropzone = { 2 paramName: "fileToUpload", 3 dictDefaultMessage: "Arraste seus arquivos para cá!", 4 maxFilesize: 300, 5 accept: function(file, done) { 6 if (file.name == "olamundo.png") { 7 done("Arquivo não aceito."); 8 } else { 9 done(); 10 } 11 } 12 }
Listagem 2. Configurando as opções do DropzoneJS.

Linha 2: informamos o valor do atributo name do elemento de input do tipo file no formulário, o qual será usado para armazenar os arquivos até que sejam, de fato, enviados ao servidor;

Linha 3: sobrescreve a mensagem padrão do elemento de upload;

Linha 4: é definido o tamanho máximo de cada arquivo em MB;

Linha 5: função que valida se o upload deve ou não ser executado. Ela é opcional, servindo apenas para validar restrições de negócio, na tela mesmo, que possam impedir o upload;

Linhas 6 a 10: forçamos um teste para verificar o mecanismo de validação do DropzoneJS. Se o arquivo selecionado tiver o nome olamundo.png, o upload será negado e a mensagem da linha 7 será exibida, caso contrário (linha 9), prosseguimos com o upload.

A Figura 1 mostra como ficará nossa página quando for executada no navegador.

Figura 1. Página do upload de arquivos.

Passo 5: Criando o upload PHP no servidor

Para finalizar o exemplo, precisamos implementar o código PHP que irá receber os arquivos enviados pelo DropzoneJS e salvar os mesmos em um diretório qualquer. Para isso, você precisará ter um servidor Apache instalado na sua máquina.

Dentro do servidor, na pasta onde salvamos os arquivos HTMLs (/htdocs no Xampp ou /www no WAMP), crie um novo arquivo de nome upload.php e adicione o código da Listagem 3.

1 <?php 2 // Nas versões do PHP que antecedem a versão 4.1.0, é preciso usar o $HTTP_POST_FILES em vez do $_FILES. 3 4 $uploaddir = './uploads'; 5 $uploadfile = $uploaddir . basename($_FILES['fileToUpload']['name']); 6 7 echo "<pre>"; 8 if (move_uploaded_file($_FILES['fileToUpload']['tmp_name'], $uploadfile)) { 9 echo "O arquivo é valido e foi carregado com sucesso.\n"; 10 } else { 11 echo "Algo está errado aqui!\n"; 12 } 13 14 echo "Aqui estão algumas informações de depuração para você:"; 15 print_r($_FILES); 16 17 print "</pre>"; 18 ?>
Listagem 3. Implementação do mecanismo de upload de arquivos no servidor

Linhas 4 e 5: definimos o diretório onde os arquivos serão salvos;

Linha 8: chamamos a função move_uploaded_file() do PHP. Essa função efetua o upload e retorna um booleano informando se o processo ocorreu com sucesso;

Linha 15: imprimimos todos os arquivos do diretório no log para atestar que o upload funcionou.

O restante das linhas serve apenas para logar informações adicionais que auxiliarão no debug do código.

A Figura 2 mostra o resultado final da implementação ao tentar o envio de:

  1. Um arquivo com sucesso;
  2. Um arquivo com erro (este, especificamente, cai no fluxo de exceção que implementamos, isto é, quando o nome do arquivo for olamundo.png);
  3. E, por fim, um arquivo de 100MB com o upload em progresso (o framework, por padrão, já vem com uma barra de loading para mostrar ao usuário o andamento do processo).

Figura 2. Resultado final da aplicação.

Confira também

Artigos relacionados