Capítulo 18 . Gerenciar o upload de arquivos

Índice
Upload de arquivos com o método POST
Explicação das mensagens de erro
Problemas comuns
Carregando múltiplos arquivos
Suporte ao método PUT

Upload de arquivos com o método POST

O PHP é capaz de receber o upload de qualquer browser que siga a norma RFC-1867 ( o que inclui Netscape Navigator 3 ou posterior , Microsoft Internet Explorer 3 com um patch da Microsoft , ou posterior sem patch ) . Isto permite que se faça o upload de arquivos de texto e binários . Com as funções de autenticação e manipulação de arquivos do PHP , você tem o controle completo de quem pode fazer o upload de arquivo e o que fazer com o arquivo após seu upload .

Note que o PHP também suporta o método PUT para upload de arquivos como o usado por Netscape Composer e W3C ' s Amaya clients . Veja Suporte ao Método Put para maiores detalhes .

Uma tela para upload de arquivo pode ser criada com um formulário especial parecido com este :

Exemplo 18-1 . Formulário para Upload de Arquivo

 
form

 
enctype="

 
multipart

 
/

 
form-data

 
"

 
action="_URL_

 
"

 
method="post

 
"

 
input

 
type="hidden

 
"

 
name="MAX_FILE_SIZE

 
"

 
value="30000

 
"

 
Send

 
this

 
file

 
:

 
input

 
name="userfile

 
"

 
type="file

 
"

 
input

 
type="submit

 
"

 
value="Enviar

 
Arquivo

 
"

 
/

 
form



A _URL_ deve indicar um arquivo PHP. O campo hidden MAX_FILE_SIZE deve vir antes do campo input e seu valor é o limite aceito de tamanho do arquivo. O valor é em bytes.
Atenção

O valor de MAX_FILE_SIZE é um aviso para o browser . É fácil contornar este limite . Então não conte que o browser irá obedecer a sua vontade . O que foi estabelecido para maximum-size no PHP não pode ser enganado .



As variáveis definidas para o upload de arquivos são diferentes dependendo da versão e da configuração . A autoglobal $_FILES existe desde o PHP 4.1.0 . A array $HTTP_POST_FILES existe desde o PHP 4.0.0 . Estas array irão conter toda a informação do upload do arquivo . Usar $_FILES é preferido . Se a opção register_globals é on , os nomes de variáveis relacionados também existirão . O padrão de register_globals é off desde o PHP 4.2.0 .

Os conteúdos de $_FILES do nosso script de exemplo é como segue . Note que isso assume que o nome do upload do arquivo é userfile , como o usado no exemplo acima .

$_FILES['userfile']['name']

O nome original do arquivo no computador do usuário .

$_FILES['userfile']['type']

O tipo mime do arquivo , se o browser deu esta informação . Um exemplo pode ser " image / gif " .

$_FILES['userfile']['size']

O tamanho , em bytes , do arquivo .

$_FILES['userfile']['tmp_name']

O nome temporário do arquivo , como foi guardado no servidor .

$_FILES['userfile']['error']

O código de erro associado a este upload de arquivo . [ 'error' ] foi adicionado no PHP 4.2.0



Nota : Em versões anteriores a 4.1.0 o nome era $HTTP_POST_FILES e não é uma variável autoglobal como $_FILES é . PHP 3 não suporta $HTTP_POST_FILES .

Quando register_globals esta em on no php.ini , variáveis adicionais estão disponíveis . Por exemplo , $userfile_name será igual a $_FILES[ 'userfile']['name' ] , $userfile_type será igual a $_FILES['userfile']['type' ] , etc . Lembre-se que desde o PHP 4.2.0 , o padrão para register_globals é off . É preferrível não depender desta opção .

Os arquivos serão guardados no diretório temporário do servidor , a menos que outro lugar seja especificado com a opção upload_tmp_dir no php.ini . O diretório padrão do servidor pode ser mudado se mudando o valor da variável de ambiente TMPDIR O diretório padrão do servidor pode ser mudado se mudando o valor da variável de ambiente TMPDIR no ambiente onde o PHP esta sendo executado PHP . Mudando-a com putenv( ) de um script PHP não irá funcionar . Esta variável de ambiente também pode ser usada para se ter certeza que outras operações estão funcionando no arquivo do upload .

Note que deve se definir upload_temp_dir no php.ini ou TMPDIR , não podendo estarem ambos vazios , sendo recomendado no mínimo upload_tmp_dir .

Exemplo 18-2 . Validando o upload de arquivos

Veja também as funções is_uploaded_file( ) e move_uploaded_file( ) para maiores informações . O seguinte exemplo irá processar o envio de um arquivo que vem de um formulário .

 
?php

 
/

 
/

 
Nas

 
versões

 
anteriores

 
a

 
4.1.0

 
,

 
$HTTP_POST_FILES

 
deve

 
ser

 
usado

 
ao

 
invés

 
de

 
$_FILES

 
.

 
/

 
/

 
Nas

 
versões

 
anteriores

 
a

 
4.0.3

 
,

 
use

 
copy(

 
)

 
e

 
is_uploaded_file(

 
)

 
ao

 
invés

 
move_uploaded_file

 
$uploaddir

 
=

 
'

 
/

 
var

 
/

 
www

 
/

 
uploads

 
/

 
'

 
;

 
print

 
"

 
pre

 
"

 
;

 
if

 

(move_uploaded_file($_FILES['userfile']['tmp_name']

 
,

 
$uploaddir

 
.

 
$_FILES['userfile']['name'])

 
)

 
{

 
print

 
"O

 
arquivo

 
é

 
valido

 
e

 
foi

 
carregado

 
com

 
sucesso

 
.




 
Aqui

 
esta

 
alguma

 
informação:\n"

 
;

 
print_r($_FILES)

 
;

 
}

 
else

 
{

 
print

 
"Possivel

 
ataque

 
de

 
upload

 
!




 
Aqui

 
esta

 
alguma

 
informação:\n"

 
;

 
print_r($_FILES)

 
;

 
}

 

?



O script PHP que irá receber o arquivo do upload deve implementar qualquer lógica que for necessária para determinar o que deve ser feito com o arquivo do upload . Você pode , por exemplo , usar a variável $_FILES[ 'userfile']['size' ] para descartar qualquer arquivo que seja muito pequeno ou muito grande . Você pode usar a variável $_FILES[ 'userfile']['type' ] que não sejam de um certo tipo . Desde o PHP 4.2.0 , você pode usar $_FILES[ 'userfile']['error' ] e planejar a sua lógica de acordo com os códigos de erro . Qualquer que seja a lógica , você deve excluir o arquivo do diretório temporário ou move-lo para outro lugar .

O arquivo será excluído do diretório temporário ao fim do script se não tiver sido movido ou renomeado .