Formulários e upload de múltiplos arquivos com PHP
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_gera.php
- Após você enviar seu formulário pedindo dados comuns (não é mostrado aqui, porque é o pré-requisito para que você leia esse artigo), no nosso caso o nome do evento, local e data, deve ser chamado form_conta.php. Nada mais é que um campo text de formulário que pede para o usuário digitar um número, no caso a quantidade de fotos a ser enviada.
- form_conta.php chama form_gera.php, que imprimirá o nosso formulário de. O ponto chave é o loop que itera até completar a quantidade fornecida, imprimindo os campos para upload da foto. Deve-se notar o nome dos campos é sempre o mesmo, fotos[], dessa maneira, o PHP saberá que estará recebendo vários arquivos no upload (será criado um array chamado $_FILES['fotos']).
- E por último, form_gera.php chama processa_upload.php, que como o nome diz, irá processar a validação e o envio dos arquivos. É o que veremos na próxima seção.
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ós você enviar seu formulário pedindo dados comuns (não é mostrado aqui, porque é o pré-requisito para que você leia esse artigo), no nosso caso o nome do evento, local e data, deve ser chamado form_conta.php. Nada mais é que um campo text de formulário que pede para o usuário digitar um número, no caso a quantidade de fotos a ser enviada.
- form_conta.php chama form_gera.php, que imprimirá o nosso formulário de. O ponto chave é o loop que itera até completar a quantidade fornecida, imprimindo os campos para upload da foto. Deve-se notar o nome dos campos é sempre o mesmo, fotos[], dessa maneira, o PHP saberá que estará recebendo vários arquivos no upload (será criado um array chamado $_FILES['fotos']).
- E por último, form_gera.php chama processa_upload.php, que como o nome diz, irá processar a validação e o envio dos arquivos. É o que veremos na próxima seção.
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?
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
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.
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)
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)