0

Classe para manipulação de uploads

criado por Raphael Basso em 21/01/2007 6:45am
Antes de começar, porque não analizar o sistema de uploads do PHP, que por sinal é muito bom, e o mais importante, não precisa de componentes externos como em outras "linguagens".

Apesar de tudo isso, o sistema me parece um pouco arcaico, com esse negócio de variáveis e funções, dando nó na cabeça de muita gente (até na minha).

O PHP é capaz de receber o upload de qualquer browser que siga a norma RFC-1867, permitindo assim, o envio de arquivos de texto e binários. Com as funções de manipulação de arquivos do PHP, você tem o controle completo de quem pode fazer e o que fazer com o arquivo após seu upload.

Formulário Simples de Upload

Um formulário de upload pode ser criado a partir de um exemplo simples como este:

<!-- Formulário Simples de Upload -->
<form action="__URL__" enctype="multipart/form-data" method="post"><br />
  <!-- Tamanho máximo do arquivo em bytes -->
  <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
  <!-- Campo para envio -->
  <input type="file" name="upload" /><br />
  <input type="submit" value="Enviar" />
</form>

Analizando o formulário acima, temos:
- __URL__: Deve ser substituído pelo arquivo de script PHP.
- MAX_FILE_SIZE: Valor limite aceito para o envio do arquivo.

OBS.: Tenha certeza que seu formulário de upload tenha a cláusula enctype="multipart/form-data" em outro caso, o upload do arquivo não irá funcionar. Há ainda uma coisa a ser dita sobre o campo que contêm a instrução MAX_FILE_SIZE, mas vou deixar para quando chegarmos na parte de múltiplos uploads.

Após fazer o upload, serão criadas algumas variáveis globais dependendo da versão do PHP e da configuração. A variável $_FILES existe desde o PHP 4.1.0 em diante. Já $HTTP_POST_FILES, existe desde o PHP 4.0.0. Estes arrays irão conter toda a informação do upload do arquivo e é preferível o uso da variável $_FILES.

O conteúdo da variável $_FILES

Ao se fazer o upload de arquivos, será criada uma variável global $_FILES e o seu conteúdo é como se segue:

- $_FILES['campo']['name']: O nome original do arquivo no computador do usuário.
- $_FILES['campo']['type']: O tipo mime do arquivo, se o browser deu esta informação.
- $_FILES['campo']['size']: O tamanho, em bytes, do arquivo.
- $_FILES['campo']['tmp_name']: O nome temporário do arquivo, como foi guardado no servidor.
- $_FILES['campo']['error']: O código de erro associado a este upload de arquivo.

OBS.: ['error'] foi adicionado no PHP 4.2.0.

<h4>Códigos das Mensagens de Erro</h4>


O PHP retorna um código de erro apropriado no array do arquivo. O código de erro pode ser encontrado em
['error']
no array que é criado durante o upload do arquivo. Em outras palavras, o erro deve ser encontrado em
$_FILES['campo']['error']
:<br /><br />

<table border="0" cellspacing="0" cellpadding="0" bgcolor="#e0e0e0" style="padding : 4px">
<tr><td width="200" style="font-size : 10pt">
UPLOAD_ERR_OK
</td>

<td width="70">
Valor: 0
</td>
<td> Não houve erro, o upload foi bem sucedido.
</td></tr>

<tr><td style="font-size : 10pt">
UPLOAD_ERR_INI_SIZE
</td>

<td>
Valor: 1
</td>

<td>O arquivo é maior do que o limite definido no php.ini.
</td></tr>

<tr><td style="font-size : 10pt">
UPLOAD_ERR_FORM_SIZE
</td>

<td>
Valor: 2</td>

<td>O arquivo é maior do que o limite de tamanho em MAX_FILE_SIZE.
</td></tr>

<tr><td style="font-size : 10pt">
UPLOAD_ERR_PARTIAL
</td>

<td>
Valor: 3</td>

<td>O upload do arquivo foi feito parcialmente.
</td></tr>

<tr><td style="font-size : 10pt">
UPLOAD_ERR_NO_FILE
</td>

<td>
Valor: 4</td>

<td>Não foi feito o upload do arquivo.
</td></tr>
</table>


<hr />

<h4>Fazendo o Upload de 1 Arquivo</h4>

Segue-se abaixo o exemplo de upload de 1 arquivo:

<div style="background-color : #e0e0e0; width : 560px; padding : 4px;">
	<span style="color : #009900"><!-- Formulário de Upload - form.php --></span><br /><br />

<form action="upload.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="submit" value="Enviar" /><br />
</form>
</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 Upload - upload.php </span><br /><br />
   $error = $_FILES['upload']['error'];<br /><br />
   $destiny = "/var/www/uploads/" . $_FILES['upload']['name'];<br /><br />
   switch ($error)<br />
   {<br />

      case UPLOAD_ERR_OK:<br />
         $tmp = $_FILES['upload']['tmp_name'];<br /><br />
         move_uploaded_file($tmp, $destiny);<br /><br />
         <span style="color : #0000ff">echo</span> "Arquivo enviado com êxito.";<br />
      break;<br /><br />

      case UPLOAD_ERR_INI_SIZE: case UPLOAD_ERR_FORM_SIZE:<br />
         <span style="color : #0000ff">echo</span> "O arquivo é maior do que o esperado!";<br />
      break;<br /><br />

      case UPLOAD_ERR_PARTIAL:<br />
         <span style="color : #0000ff">echo</span> "Arquivo parcialmente enviado!";<br />
      break;<br /><br />

      case UPLOAD_ERR_NO_FILE:<br />
         <span style="color : #0000ff">echo</span> "O arquivo não enviado!";<br />
      break;<br />
   }<br />
?>
</div>

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.)