0

Classe para manipulação de uploads

criado por Raphael Basso em 21/01/2007 6:45am
<p align="justify">O upload de múltiplos arquivos é muito simples também de se fazer (apesar de várias pessoas dizerem o contrário). Mas antes, alguma teoria se faz necessária...</p>

<p align="justify">Para que o interpretador PHP entenda que foram enviados mais de 1 arquivo, basta no formulário HTML nomear todos os campos normalmente, com apenas uma coisa a mais: [ ] (conchête esquerdo e o direito juntos). Sim é o que você está pensando: ARRAY!</p>

Exemplo:<br /><br />

<div style="background-color : #e0e0e0; width : 570px; padding : 4px;">
	<span style="color : #009900"><!-- Formulário de Upload de Mútiplos Arquivos - form2.php --></span><br /><br />

<form action="upload2.php" enctype="multipart/form-data" method="post"><br />
<br />
   <input type="hidden" name="MAX_FILE_SIZE" value="30000" /><br /><br />
   <input type="file" name="upload[]" />
<br /><br />

   <input type="file" name="upload[]" />
<br /><br />

   <input type="file" name="upload[]" />
<br /><br />

   <input type="file" name="upload[]" />
<br /><br />

   <input type="file" name="upload[]" />
<br /><br />

   <input type="submit" value="Enviar" /><br />
</form>
</div><br />

<p align="justify">OBS.: Nada te impede de usar esse "esquema" com somente 1 arquivo.

<hr />

<h4>Pausa...</h4>

<p align="justify">Já é hora de falar sobre a instrução MAX_FILE_SIZE. Eu deixei pra falar agora, porque esta instrução tem tudo a ver com o momento. Relembrando, ela serve para limitar pelo formulário o tamanho dos arquivos enviados. Mas somente foi usado com um só campo. E agora que tem mais?
</p>

<p>Muitas pessoas dizem que ela limita todos os campos, outros dizem que limita o tamanho de cada campo individualmente. A resposta certa é: ELA LIMITA O TAMANHO DE CADA CAMPO!</p>

<p>Quer dizer, se você têm 10 campos, com o MAX_FILE_SIZE em 300KB, cada campo pode enviar 300KB. Naturalmente, poderá enviar até 3000KB (como eu sou bom de matemática). Diversas pessoas pensam que o PHP soma o tamanho de todos os arquivos enviados e depois verifica se é maior ou menor... Ledo engano.</p>

<hr />

<h4>Continuando...</h4>

<p align="justify">Diversos programadores caem no artigo de pensar tipo assim: "ahaa, já que ele passa um array, agora eu dô um
count($_FILES['campo'])
e ele me mostra o total de arquivos enviados!!! Eu sô foda!!!"</p> Minutos depois...

<p align="justify">Lá vem ele e me diz: "Essa b num funfa, eu ponho lá 10 campos e ele só mostra 5!" (Se você pensou como o meu amigo(a) anterior, está redondamente enganado(a)).
</p>

<p align="justify">
O problema é que ao invés do PHP criar um array tipo assim:<br /><br />

$_FILES['campo'][0]['name']
<br /><br />

não, ele inverte "as bola":

<br /><br />

$_FILES['campo']['name'][0]

</p>

<p align="justify">O que acontece é que você está contando o primeiro vetor, que como sabemos só tem cinco elementos (name, type, size, tmp_name, error). Para fazer isso funcionar, basta:
</p>

<p>
count($_FILES['campo']['name'])
</p>

<p>OBS.: Para contar, pode-se usar qualquer elemento do segundo array</p>

<hr />

<h4>Exemplo Completo de Mútiplos Uploads</h4>

<p align="justify">Neste formulário, falta o cabeçalho HTML, mas somente com isso é para funcionar... (E eu tamém tô com preguiça de escrevê)</p>

<div style="background-color : #e0e0e0; width : 570px; padding : 4px;">
	<span style="color : #009900"><!-- Formulário de Upload de Mútiplos Arquivos - form2.php --></span><br /><br />

<form action="upload2.php" enctype="multipart/form-data" method="post"><br />
<br />
   <input type="hidden" name="MAX_FILE_SIZE" value="300000" /><br /><br />
   <input type="file" name="upload[]" /><br />
<br /><br />

   <input type="file" name="upload[]" /><br />
<br /><br />

   <input type="file" name="upload[]" /><br />
<br /><br />

   <input type="file" name="upload[]" /><br />
<br /><br />

   <input type="file" name="upload[]" /><br />
<br /><br />

   <input type="submit" value="Enviar" /><br />
</form><br /><br />

	<span style="color : #009900"><!-- Eu sei, "Copy & Paste" mas mê dêem uma folga... --></span>
</div><br />

<div style="background-color : #e0e0e0; width : 560px; padding : 4px;">
<?<span style="color : #ff0000">php</span><br /><br />
   <span style="color : #009900">// Script de Múltiplos Uploads - upload2.php</span><br /><br />

   <span style="color : #009900">// Pasta para onde serão enviados os arquivos </span><br /><br />

   $destiny = "/var/www/upload/";<br /><br />

   <span style="color : #009900">// Total de arquivos enviados</span><br /><br />

   $total = 0;<br /><br />

   <span style="color : #009900">// Arquivos com qualuqer tipo de erro</span><br /><br />

   $nsp = 0;<br /><br />

   $n = count($_FILES['upload']['name']);<br /><br />
   for ($i = 0; $i < $n; $i++)<br />
   {<br />
      $error = $_FILES['upload']['error'][$i];<br /><br />
      switch ($error)<br />
      {<br />

         case UPLOAD_ERR_OK:<br />
            $tmp = $_FILES['upload']['tmp_name'][$i];<br /><br />
            $name = $_FILES['upload']['name'][$i];<br /><br />
            move_uploaded_file($tmp, $destiny . $name);<br /><br />
            $total++;<br />
         break;<br /><br />

         default:<br />
            $nsp++;<br />
         break;<br />
      }<br />
   }<br /><br />
   <span style="color : #0000ff">printf</span>("Total de arquivos enviados.: %d", $total);<br />
   <span style="color : #0000ff">printf</span>("<br />Arquivos com algum tipo de erro.: %d", $nsp);<br />
?>
</div><br />

<p align="justify"><span style="color : #ff0000">IMPORTANTE:</span><br /><br />Com o upload de múltiplos arquivos, ocorre um simples inconveniente. Suponha que você colocou 10 campos de upload. Mas vou eu lá e só faço 1. O que acontecerá?
</p>

<p align="justify">
Simplemente acusará o código de erro 5 (UPLOAD_ERR_NO_FILE) em todos os campos que estiverem em branco. Isso quer dizer que nenhum arquivo foi enviado, portanto... Mas com este código, esse tipo de problema não acontece (só porque fui eu que fiz - hahahaha).
</p>

Comentários:

Nenhum comentário foi enviado ainda.

Novo Comentário:

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