Upload de multiplos arquivos com PHP

22 02 2007

Fala pessoal!
A pedido do leitor Rodrigo Almeida, vou escrever aqui um mini tutorial de como criar um formulário para upload de multiplos arquivos.
Para começar então, vou demonstrar como se cria um formulário para upload de um único arquivo, e depois passaremos para upload de multiplos arquivos.


<?php

if( isset( $_POST['enviar'] ) ) {

    $erro '';
    
$pathToSave '/tmp/';

    // A variavel $_FILES é uma variável do PHP, e é ela a responsável
    // por tratar arquivos que sejam enviados em um formulário

    if( $_FILES['arquivo']['name'] != '' ) {
        
$arquivoTmp $_FILES['arquivo']['tmp_name'];
        
$arquivo $pathToSave.$_FILES['arquivo']['name'];

        // Copia o arquivo para o sistema
        
if( !move_uploaded_file$arquivoTmp$arquivo ) ) {
            
$erro 'Erro no upload. Verifique as permissoes do diretorio';
        }
    } else {
        
$erro 'É necessario escolher um arquivo para enviar';
    } 

}

?>

<form method='POST' enctype='multipart/form-data'>
    Arquivo: <input type='file' name='arquivo'>
    <br>
    <input type='submit' value='Enviar' name='enviar'>
</form>

O exemplo por si só é bastante explanatório. Certifique-se de que você substituiu o caminho no qual deseja salvar o arquivo, e que o usuário que está executando o php tem permissão para escrever nesse diretório.O comando move_uploaded_file é reponsável por pegar o arquivo que foi enviado, e então salva-lo no local que você especificou. Seguindo em frente então, vamos ver como fazer o envio de multiplos arquivos no mesmo formulário.
Vejamos um segundo exemplo:


<?php

if( isset( $_POST['enviar'] ) ) {

    $pathToSave '/tmp/';

    // A variavel $_FILES é uma variável do PHP, e é ela a responsável
    // por tratar arquivos que sejam enviados em um formulário
    // Nesse caso agora, a nossa variável $_FILES é um array com 3 dimensoes
    // e teremos de trata-lo, para realizar o upload dos arquivos
    // Quando é definido o nome de um campo no form html, terminado por []
    // ele é tratado como se fosse um array, e por isso podemos ter varios
    // campos com o mesmo nome
    
$i 0;
    
$msg = array( );
    
$arquivos = array( array( ) );
    foreach(  
$_FILES as $key=>$info ) {
        foreach( 
$info as $key=>$dados ) {
            for( 
$i 0$i sizeof$dados ); $i++ ) {
                
// Aqui, transformamos o array $_FILES de:
                // $_FILES["arquivo"]["name"][0]
                // $_FILES["arquivo"]["name"][1]
                // $_FILES["arquivo"]["name"][2]
                // $_FILES["arquivo"]["name"][3]
                // para
                // $arquivo[0]["name"]
                // $arquivo[1]["name"]
                // $arquivo[2]["name"]
                // $arquivo[3]["name"]
                // Dessa forma, fica mais facil trabalharmos o array depois, para salvar
                // o arquivo
                
$arquivos[$i][$key] = $info[$key][$i];
            }
        }
    }

    $i 1;

    // Fazemos o upload normalmente, igual no exemplo anterior
    
foreach( $arquivos as $file ) {

        // Verificar se o campo do arquivo foi preenchido
        
if( $file['name'] != '' ) {
            
$arquivoTmp $file['tmp_name'];
            
$arquivo $pathToSave.$file['name'];

            if( !move_uploaded_file$arquivoTmp$arquivo ) ) {
                
$msg[$i] = 'Erro no upload do arquivo '.$i;
            } else {
                
$msg[$i] = sprintf('Upload do arquivo %s foi um sucesso!',$i);
            }
        } else {
            
$msg[$i] = sprintf('O arquivo %d nao foi preenchido',$i);
        }

        $i++;
    }

    // Imprimimos as mensagens geradas pelo sistema
    
foreach( $msg as $e ) {
        
printf('%s<br>'$e);
    }

}

?>

<form method='POST' enctype='multipart/form-data'>
    Arquivo1: <input type='file' name='arquivo[]'><br>
    Arquivo2: <input type='file' name='arquivo[]'><br>
    Arquivo3: <input type='file' name='arquivo[]'><br>
    Arquivo4: <input type='file' name='arquivo[]'><br>
    <br>
    <input type='submit' value='Enviar' name='enviar'>
</form>

Veja então, que no exemplo acima, criamos um formulário, onde os campos todos tem o mesmo nome, porém são tratados como um array, por terminarem com ‘[]’. A parte mais trabalhosa é entendero array que recebemos então, e trata-lo. Depois de tratado o array, prosseguimos normalmente com o upload do arquivo.
Espero que tenha ficado claro como fazer esse upload de multiplos arquivos. Se quiser entender como a variável $_FILES é, tente utilizar a funcao var_dump nela, para ver seu conteúdo, e enteder melhor o primeiro conjunto de laços foreach que foi demonstrado no exemplo.
Caso tenha permanecido alguma duvida, afinal trabalhar com arrays de 3 ou mais dimensões é um pouco mais complicado, deixe ai um comentário, que tentarei esclarecer da melhor forma possível.

Novamente, agradeço ao leitor Rodrigo Almeida pela sugestão, e peço para que todos participem, e mandem ai suas dúvidas, críticas e sugestões.

[]s

Edit: Bom, pelo visto pode estar havendo dificuldade em copiar e colar o código dos exemplos diretamente em algum editor de texto, pois o WordPress troca as aspas simples por um tipo de aspa esquisito. Por esse motivo, enviei os códigos em formato txt.
Os links:
upload.txt – Primeiro exemplo
upload2.txt – Segundo exemplo

Anúncios

Ações

Information

40 responses

23 02 2007
Henrique

Ó, esqueci de comentar sobre o tamanho do arquivo, então, citando o comentário do E. Silva, no outro Post

“A questão de suportar arquivos grandes pode ser pelo fato de o PHP, por padrão, aceitar upload de arquivos com tamanho máximo de 2MB.
Para modificar este comportamento, basta modificar o seguinte no arquivo de configuração (php.ini)

de
upload_max_file_size = 2MB

para

upload_max_file_size = 32MB

Neste caso, o tamanho máximo de arquivo enviado seria de 32MB”

; )

23 02 2007
Erick de Oliveira leal

Olá, vale lembrar ao leior Rodrigo Almeida que para ele manipular arquivos grandes é necessário aumentar as diretivas upload_max_filesize, memory_limit, post_max_size.

Post_max_size precisa ser maior que o upload_max_filesize, o memory_limit precisa ser maior post_max_size.

23 02 2007
Rodrigo Almeida

Obrigado por tentar sanar mnhas dúvidas com arrays em arquivos multiplos, mas eu lamento dizer seu código está bagunçado demais, ele não roda nem a pau. Se possível eu peço com muito favor que limpe, organize seu código. Existem aspas erradas. O formulário está completamente estranho. Nossa.

23 02 2007
Henrique

Fala Rodrigo.
Bom, aqui o código não aparece nada bagunçado. Que navegador você usa ai? Estou usando firefox 2.0.0.1 aqui.
Quanto ao código não funcionar, você deve ter tentado copia-lo direto do navegador para o editor de textos, e as aspas foram alteradas, pois o WordPress altera as aspas quando faço o post, e elas nao funcionam no código.
Coloquei o código em arquivos TXT no final do post, para que você possa baixar e testar.
Fiz questão de testar os dois códigos aqui, antes de envia-los, e ambos funcionam perfeitamente.
Espero que agora facilite ai para todos : )

23 02 2007
Rodrigo Almeida

Muito obrgado. É a única coisa que posso dizer pelo trabalho de vocês.

23 02 2007
Erick de Oliveira Leal

Olá pessoal, mais uma vez venho aqui pedir um tutorial que será degrande utilidade, pois, para encontrar algum semelhante na internet é muito difícil. O tutorial é sobre cadastro com confirmação por email. Eu só consegui encontrar um em português e é do ano de 2004, se for possível faça-o. Eu serei grato eternamente e tenho certeza toda a comunidade ficará feliz. Abraços. Muito obrigado.

24 02 2007
Thiago Rodrigues

Muito bom o seu tutorial.
Vou aproveitar o assunto, me lembro que a uns anos atrás – há muito tempo não acesso – no VilaBol (hospedagem do bol.com.br) havia a opção de enviar um arquivo .zip e depois que estava no host descompactar o mesmo.
Você sabe fazer isto? Se souber crie um tutorial sobre isto.
Abraço

2 03 2007
ASPECTO.Net - Notícias » Blog Archive » Upload de multiplos arquivos com PHP

[…] excelente tutorial sobre upload por Henrique, do PHP-BR […]

18 09 2007
Diogo

show esse tutorial, mas como faço pra no caso ele fzer upload de multiplos arquivos com nomes diferentes, pra nao ficar nome repetido, no caso vou cadastrar o nome das imgs no mysql….Vlw…

7 10 2007
Warley Pereira

Amei a matéria… Eu queria fazer algo parecido mas não sabia como nem onde perguntar. Valeu galera de mais!!!

AMEI MAS SOU NOVO NO PHP5…

Tenho só mais uma pergunta:
Como faço para salvar os dados do formulário em um arquivo remoto tipo um TXT?

Se alguém puder me dizer sou muito grato podem me mandar por email: warley@cxj.com.br ou postar aqui no site mesmo.

31 10 2007
Diego

Esse topico ficou muito bom ….

me ajudou muito ….

30 11 2007
Leonardo Gazio

pessoal pra quem não tem acesso ao php.ini(eu acho que a maioria assim como eu) eu tenho aqui um .htaccess que resolve o problema da limitação do tamanho do upload. Quem quiser é só me enviar um E-mail que eu passo ele, é mole mole, é só colocar o htaccess na pasta onde tá o script e no script antes da execução do upload setar o limite de tempo pra 0(zero) pra que o servidor espere o tempo que for necessário a execução do script…

26 12 2007
Nildemar

Leonardo Gazio: por favor, gostaria de saber como farei para meu provedor aceitar upload de arquivos grandes.

26 12 2007
Nildemar

Leonardo Gazio: por favor, gostaria de saber como farei para meu provedor aceitar upload de arquivos grandes.

nildemar@gmail.com

2 02 2008
marcelo

valeu meu caro, utilizei somente a parte do upload com outro script usando mootools e o exemplo de upload serviu corretamente, apenas fiz um ajuste para pegar o caminho completo do path onde se deseja colocar a imagens. valeu mesmo, abçs

26 03 2008
Freelancer Programador PHP

Muito boa essa matéria, estava precisando disso, vou ver se consigo fazer!

valeu

5 07 2008
marcelo

galera to tentando faz um tempão alterar o php.ini ou enganalo para fazer uploads maiores mas nao consigo to desesperado.sera que alguem pode me ajudar?
desde ja agradeço…

9 09 2008
Lilian

Show de bola sua explicação, funcionou direitinho, porém preciso saber como exibir os dados…
Utilizei o primeiro upload (simples), e gostaria de mostrar as informação bem como o arquivo que coloquei no servidor , para que as pessoas pudessem fazer o download do mesmo.

Se puder me ajudar, fico agradecida.

22 10 2008
Cleberson

Tutorial, magnifico… Meus parabéns pelo trabalho.

22 12 2008
Andre Luiz

Sholl de bola, mas preciso que Leonardo Gazio me mande o “.htaccess” para que possa resolver o problema de tempo e me diga como setar o tempo “0” no script.

Gostaria de saber também como impedir que façam uplods de determinadas extensões como scripts que poderiam ser rodados dentro do site e causar danos. Tem como?

10 03 2009
Lucas

bem.. só me resta agradecer!.. hehe.
show de bola!

17 03 2009
Hansmiller

Amigos tudo bom.
Tem como adicionar neste sistema um aviso no email de quando a pessoa fizer o upload dos arquivos?
Revivendo depois e muito tempo. abraço a todos.

27 03 2009
Zeca

parabens muito bom

2 05 2009
Nelson

Amigão, jóia jóia seu tuto… agora eu quero mesmo aumentar a taxa do upload de meu servidor unsando o .htaccess mande ae ednelsonpinheiro@hotmail.com muito obrigadão!

5 02 2010
André de Mello

Boa rapaz…

tutorial bakana…

Abração!!!

30 09 2010
VInicius

Kra muito bom, gostei, simples e prático !

19 10 2010
Luciana

Boa tarde caro Henrique.
Obrigada pelo código, vou testá-lo. Ele funciona para arquivos de vídeo?

vlw

20 02 2011
Delcio

Dos códigos que pesquisei na internete esse foi o melhor, mas parece que o autor esqueceu de concatenar a “/” no caminho do arquivo na linha 41 do segundo tutorial:

$arquivo = $pathToSave.$file[‘name’];

ficando assim: $arquivo = $pathToSave.”/”.$file[‘name’];

28 07 2011
Deivid

Muito bom o artigo… Voce poderia postar um exemplo de como upload em uma pasta inteira ? escolhendo apenas a pasta ? exemplo uma pasta de imagens imagens ?

21 08 2011
Fábio

Gostaria de saber se é possivel enviar arquivos do Word, Pdf e fotos de um email, para dentro de um site? Ou seja, queria desenvolver um site que, depois que eu hospedá-lo e quiser postar alguma noticia ou fotos eu só envie pelo meu email pessoal esses arquivos e eles apareçam no site para todos os usúarios abrir e ler como nos emails. Queria saber se isso é possivel, e se você saberia os códigos para fazer esse procedimento em php, ou se poderia me endicar algum site que fale sobre isso? Desde já obrigado.

22 08 2011
Deivid

é possivel selecionar uma pasta ? em vez de arquivo por arquivo no upload multiplo ?

23 08 2011
Cardoso

Quantos Mb cada upload suporta?

28 06 2012
julho

Não é mais fácil assim?
depois pega os valores do array com o foreach.

8 08 2012
Henrique

onde o arquivo está sendo salvo?

8 08 2012
Henrique

ou movido??

28 08 2012
Thiago

Como posso gravar o caminho no banco?

24 05 2013
Neto

Obrigado pela ajuda amigo, funcionou perfeitamente!
Ahhh
E pra facilitar, agora com o HTML5 pode-se usar ao invés de vários:
Arquivo1:
Arquivo2:
Arquivo3:

Apenas uma linha adicionando a tag ‘multiple’:

Arquivo1:

24 05 2013
Neto

Não apareceu a tag, vou postar os valores separados:

Substituir isso:

Arquivo1:
Arquivo2:
Arquivo3:

Por isso:

Arquivo3:

29 07 2013
Natan

e bom em parte… ele faz upload msm + so q se uma pessoa fizer upoad de um arquivo com msm nome ele substitui oq exist fods

27 01 2014
Jean Carlos

Funcionando uma maravilha :D Só preciso gravar em banco agora xD

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s




%d blogueiros gostam disto: