+3

Formulários e upload de múltiplos arquivos com PHP

criado por Alfred R. Baudisch em 24/12/2006 9:35pm
2) Montando o formulário
Para apenas um campo de formulário, usa-se o nome que bem entender. Para vários arquivos, também, mas adiciona-se [] (abre e fecha colchetes) no final do nome, transformando o campo de upload em um array de campos. Parece complicado? Mas não é, pois tenho certeza que você já está careca de fazer isso. É o mesmo que acontece com um checkbox e selectbox de múltiplas opções (ver "Manipulando dados de Formulário com PHP – Parte 1" - http://www.phpbrasil.com/articles/article.php/id/719).

Também não esquecer que upload de arquivos só é possível via método POST e que sempre deve ser colocado o atributo enctype="multipart/form-data" na declaração do formulário.

Para criar os múltiplos campos de upload, vamos para o CASO 1, em que a quantidade é variável. São necessárias então duas ações para gerar o formulário: definir a quantidade de campos e imprimí-los dentro de um formulário.

A melhor maneira é colocar tudo numa mesma página, mas como isso é um artigo e precisamos ser ágeis, vamos dividir em dois arquivos: form_conta.php – irá pedir a quantidade de campos e form_gera.php – irá gerar o formulário.

Vamos ao código de ambos e logo após as explicações.

form_conta.php
<form action="form_gera.php" method="post">
Envio das fotos<br />
Qual a quantidade de imagens do Evento?<br /><br />
<input type="text" name="quantidade" size="5"/><br />
<input type="submit" value="OK"/>
</form>

form_gera.php
<?php

// Obtém quantidade enviada. Perceba que verifica se é um número inteiro,
// caso contrário, é usada uma quantidade padrão, 5.
$Quantidade = (isset($_POST['quantidade']) && is_int(intval($_POST['quantidade']))) ? (int)$_POST['quantidade'] : 5;

// Abre formulário de upload
echo '<form action="processa_upload.php" method="POST" enctype="multipart/form-data">';
echo 'Envio das fotos<br />';

// Imprime os campos para upload, de acordo com a quantidade pedida
for($i = 1; $i <= $Quantidade; ++$i)
{
    echo 'Foto #' . $i . ': <input type="file" name="fotos[]" /><br/>';
}

// Fecha formulário
echo '<br /><input type="submit" value="OK"/>';
echo '</form>';

?>

- Ap&oacute;s voc&ecirc; enviar seu formul&aacute;rio pedindo dados comuns (n&atilde;o &eacute; mostrado aqui, porque &eacute; o pr&eacute;-requisito para que voc&ecirc; leia esse artigo), no nosso caso o nome do evento, local e data, deve ser chamado form_conta.php. Nada mais &eacute; que um campo text de formul&aacute;rio que pede para o usu&aacute;rio digitar um n&uacute;mero, no caso a quantidade de fotos a ser enviada.

- form_conta.php chama form_gera.php, que imprimir&aacute; o nosso formul&aacute;rio de. O ponto chave &eacute; o loop que itera at&eacute; completar a quantidade fornecida, imprimindo os campos para upload da foto. Deve-se notar o nome dos campos &eacute; sempre o mesmo, fotos[], dessa maneira, o PHP saber&aacute; que estar&aacute; recebendo v&aacute;rios arquivos no upload (ser&aacute; criado um array chamado $_FILES['fotos']).

- E por &uacute;ltimo, form_gera.php chama processa_upload.php, que como o nome diz, ir&aacute; processar a valida&ccedil;&atilde;o e o envio dos arquivos. &Eacute; o que veremos na pr&oacute;xima se&ccedil;&atilde;o.

Comentários:

Mostrando 1 - 10 de 13 comentários
Muito bom! Obrigado!!
28/09/2011 5:41pm (~13 anos atrás)

O problema dos 2MB de limite de upload deve-se ao facto das configurações do PHP estarem definidas para esse valor.
No ficheiro php.ini normalmente tem essa propriedade upload_max_filesize = 2M
Tente alterar para ver como resulta.

Estou com o mesmo problema das 5 fotos, qualquer que seja o valor que eu coloque na quantidade o tamanho do array é sempre 5 e dai nao deixar enviar mais de 5 fotos.

Alguma solução para isto? Ou é uma limitação do servidor?
16/02/2009 7:25am (~16 anos atrás)

Adorei mesmo ^^ perfeito coloquei pra faze upload de um monte de arquivo agora parece rapidshare =D muito útil mesmo Obrigado.
13/10/2008 5:16pm (~16 anos atrás)

alterei o script para permitir outros tipos de arquivos...consegui fazer o upload deles (.doc,.xls,.exe) porém não consigo postar arquivos com tamanho grandes ....acho q com + de 2 MB já da pau!!! Como faço para resolver isso??? é alguma configuração de servidor??? do Php???
05/03/2008 2:14pm (~16 anos atrás)

quando envio os arquivos ... ele faz td certinho mas só consegue enviar 5 fotos independente do numero da quantidade que eu colocar ... tem alguma explicacao pra isso???
21/06/2007 9:43am (~17 anos atrás)

Ficou muito bom mesmo esse script, pra quem esta aprendendo como eu então é dez, todo explicadinho muito bom mesmo, mas estou com um problema, quando envio a foto aparece uma mensagem dizendo: "Você não enviou foto" porque aparece a mensagem?
27/05/2007 3:07pm (~17 anos atrás)

Respondendo a gundes.rs e lacertae

Já me perguntei também se existe como selecionar uma pasta ou diversos arquivos de uma vez. Pois para o usuario é realmente insuportável, digamos, ter que selecionar 500 arquivos um a um para armazenar num sistema de GED por exemplo.
Ai pesquisando descobri uma solução usando flash, não sou amigo de flash, mais num caso extremo como este, até largo mão de meus preconceitos. O produto não és free, mais fica a dica:
http://www.element-it.com/DemoMultiPOW.aspx

O produto, permite que a interface que irá efetuar a persistencia dos arquivos no servidor, seja desenvolvida ao gosto do cliente (asp/php/perl)

No site tem um demo.

Um abraço a todos
27/03/2007 5:45pm (~17 anos atrás)

É, muito legal o script. Creio que vai ajudar muita gente. Tenho uns sistemas desenvolvidos assim. Mas o meus clientes sempre pergutam o mesmo que o amigo acima perguntou : É possível pegar todos os arquivos de uma pasta ? Ou os selecionados ?

Realmente é chato, num postador de fotos por exemplo, vc vai catando uma por uma...pra depois ENVIAR. Isso poderia ser resolvido selecionando vinte de vez, ou o que estiver na pasta. Desde que não sobrecarregue ou que tenha um limite.

Eis o DESAFIO !!..rsr.
29/01/2007 4:38am (~18 anos atrás)

show de bola o artigo!
24/01/2007 12:20pm (~18 anos atrás)

boam dia Alfred, gostei do seu script, na minha máquina ele unciona perfeitamente, mais quando coloquei no servidor, ele não envia, sabe me dizer porque??
19/01/2007 4:02am (~18 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)