Classe para manipulação de uploads
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:
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 no array que é criado durante o upload do arquivo. Em outras palavras, o erro deve ser encontrado em :<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;">
</div><br />
<div style="background-color : #e0e0e0; width : 560px; padding : 4px;">
</div>
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']
$_FILES['campo']['error']
<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 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 /> ?>
Novo Comentário: