Um excelente tutorial sobre upload por Henrique, do PHP-BR
(http://phpbr.wordpress.com/2007/02/22/upload-de-multiplos-arquivos-com-php/)
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