Upload de vários arquivos com PHP

Fala pessoal, hoje irei ensinar a fazer upload de vários arquivos de uma vez, ou seja, ao invés de criar apenas um campo para o usuário selecionar o arquivo, vamos criar múltiplos campos e fazer o upload de cada arquivo para o servidor através do PHP.

Clique aqui para fazer download do código

1. Formulário

Vamos criar nosso formulário, vou utilizar aqui como exemplo cinco campos para upload:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Upload de vários arquivos com PHP</title>
</head>

<body>
<h1>Upload de vários arquivos com PHP</h1>

<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post" enctype="multipart/form-data">
<p><input type="file" name="arquivo[]" /></p>
<p><input type="file" name="arquivo[]" /></p>
<p><input type="file" name="arquivo[]" /></p>
<p><input type="file" name="arquivo[]" /></p>
<p><input type="file" name="arquivo[]" /></p>
<p><input type="submit" value="Enviar" /></p>
</form>
</body>
</html>

Criamos um formulário e na action definimos que os dados serão enviados para o próprio arquivo, através do $_SERVER[‘PHP_SELF’]. Cada campo de upload receberá o mesmo nome, ou seja, arquivo, porém iremos colocar [] (colchetes) para que assim o php interprete como um array, onde cada arquivo receberá um índice e assim nós poderemos manipular esses arquivos.

* Lembrando que quando se trata de upload devemos definir a propriedade enctype=”multipart/form-data”;

2. Upload com PHP

Já que os dados serão enviados ao mesmo arquivo, vamos colocar nosso código PHP nesse mesmo arquivo, vou optar por colocá-lo entre o header 1 (h1) e o ínicio do formulário:

<?php
// DEFINIÇÕES
// Numero de campos de upload
$numeroCampos = 5;
// Tamanho máximo do arquivo (em bytes)
$tamanhoMaximo = 1000000;
// Extensões aceitas
$extensoes = array(".doc", ".txt", ".pdf", ".docx");
// Caminho para onde o arquivo será enviado
$caminho = "uploads/";
// Substituir arquivo já existente (true = sim; false = nao)
$substituir = false;

for ($i = 0; $i < $numeroCampos; $i++) {
	
	// Informações do arquivo enviado
	$nomeArquivo = $_FILES["arquivo"]["name"][$i];
	$tamanhoArquivo = $_FILES["arquivo"]["size"][$i];
	$nomeTemporario = $_FILES["arquivo"]["tmp_name"][$i];
	
	// Verifica se o arquivo foi colocado no campo
	if (!empty($nomeArquivo)) {
	
		$erro = false;
	
		// Verifica se o tamanho do arquivo é maior que o permitido
		if ($tamanhoArquivo > $tamanhoMaximo) {
			$erro = "O arquivo " . $nomeArquivo . " não deve ultrapassar " . $tamanhoMaximo. " bytes";
		} 
		// Verifica se a extensão está entre as aceitas
		elseif (!in_array(strrchr($nomeArquivo, "."), $extensoes)) {
			$erro = "A extensão do arquivo <b>" . $nomeArquivo . "</b> não é válida";
		} 
		// Verifica se o arquivo existe e se é para substituir
		elseif (file_exists($caminho . $nomeArquivo) and !$substituir) {
			$erro = "O arquivo <b>" . $nomeArquivo . "</b> já existe";
		}
	
		// Se não houver erro
		if (!$erro) {
			// Move o arquivo para o caminho definido
			move_uploaded_file($nomeTemporario, ($caminho . $nomeArquivo));
			// Mensagem de sucesso
			echo "O arquivo <b>".$nomeArquivo."</b> foi enviado com sucesso. <br />";
		} 
		// Se houver erro
		else {
			// Mensagem de erro
			echo $erro . "<br />";
		}
	}
}
?>

Bom, apesar do código estar comentado, vou tentar detalhar o máximo possível:

Linha 4: Definimos o número de campos para enviar arquivo, no nosso caso, 5;
Linha 6: Definimos o tamanho máximo de cada arquivo, em bytes, no caso é equivalente a aproximadamente 1MB;
Linha 8: Definimos todas as extensões válidas e colocamos em um array;
Linha 10: Definimos a pasta onde os arquivos serão gravados (não esqueça de colocar uma / – barra – depois do nome da pasta);
Linha 12: Definimos se deve ser ou não substituido um arquivo já existente, quando false, o arquivo não será substituido, quando true, o arquivo será substituido;

Linha 14: Fazemos um loop para recuperar os dados, fazer a verificação e upload de cada campo de upload, o loop só irá terminar quando nosso contador ($i) for igual ao número de campos;
Linhas 17, 18, 19: Recuperamos as informações do arquivo do campo;

Linhas 27, 28, 29: Se o tamanho do arquivo for maior que o definido, será gerado um erro;
Linhas 31, 32, 33: Pegamos a extensão do arquivo através da função strrchr() e verificamos se ela está contida no array das extensões válidas, se não estiver, será gerado um erro;
Linhas 35, 36, 37: Verificamos se o arquivo já existe e se deve ser substituido ou não;

Linhas 40 a 45: Se não houver nenhum erro, movemos o arquivo que foi enviado para o caminho definido e exibimos a mensagem de sucesso, caso contrário um erro será exibido.

Bom, espero que vocês tenham entendido. Qualquer dúvida entre em contato, ok? Espero que esse artigo tenha sido útil a vocês, abraços.