<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML ><HEAD ><TITLE >Gerenciar o upload de arquivos</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK REL="HOME" TITLE="Manual do PHP" HREF="index.html"><LINK REL="UP" TITLE="Características" HREF="features.html"><LINK REL="PREVIOUS" TITLE="Lidando com XForms" HREF="features.xforms.html"><LINK REL="NEXT" TITLE="Explicação das mensagens de erro" HREF="features.file-upload.errors.html"><META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8"></HEAD ><BODY CLASS="chapter" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#840084" ALINK="#0000FF" ><DIV CLASS="NAVHEADER" ><TABLE SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TH COLSPAN="3" ALIGN="center" >Manual do PHP</TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="bottom" ><A HREF="features.xforms.html" ACCESSKEY="P" >Anterior</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" ></TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="features.file-upload.errors.html" ACCESSKEY="N" >Próxima</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="chapter" ><H1 ><A NAME="features.file-upload" >Capítulo 38. Gerenciar o upload de arquivos</A ></H1 ><DIV CLASS="TOC" ><DL ><DT ><B >Índice</B ></DT ><DT ><A HREF="features.file-upload.html#features.file-upload.post-method" >Upload de arquivos com o método POST</A ></DT ><DT ><A HREF="features.file-upload.errors.html" >Explicação das mensagens de erro</A ></DT ><DT ><A HREF="features.file-upload.common-pitfalls.html" >Problemas comuns</A ></DT ><DT ><A HREF="features.file-upload.multiple.html" >Carregando múltiplos arquivos</A ></DT ><DT ><A HREF="features.file-upload.put-method.html" >Suporte ao método PUT</A ></DT ></DL ></DIV ><DIV CLASS="sect1" ><H1 CLASS="sect1" ><A NAME="features.file-upload.post-method" >Upload de arquivos com o método POST</A ></H1 ><P > O PHP é capaz de receber o upload de qualquer browser que siga a norma RFC-1867 (o que inclui <SPAN CLASS="productname" >Netscape Navigator 3</SPAN > ou posterior, <SPAN CLASS="productname" >Microsoft Internet Explorer 3</SPAN > 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. </P ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >Nota Sobre Configurações Relacionadas: </B > Veja também <A HREF="ini.core.html#ini.file-uploads" >file_uploads</A >, <A HREF="ini.core.html#ini.upload-max-filesize" >upload_max_filesize</A >, <A HREF="ini.core.html#ini.upload-tmp-dir" >upload_tmp_dir</A >, <A HREF="ini.core.html#ini.post-max-size" >post_max_size</A >, <A HREF="ref.info.html#ini.max-input-time" >max_input_time</A > no <TT CLASS="filename" >php.ini</TT > </P ></BLOCKQUOTE ></DIV ><P > Note que o PHP também suporta o método PUT para upload de arquivos como o usado por <SPAN CLASS="productname" >Netscape Composer</SPAN > e W3C's <SPAN CLASS="productname" >Amaya</SPAN > clients. Veja <A HREF="features.file-upload.put-method.html" >Suporte ao Método Put </A > para maiores detalhes. </P ><P > Uma tela para upload de arquivo pode ser criada com um formulário especial parecido com este: <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN6894" ></A ><P ><B >Exemplo 38-1. Formulário para Upload de Arquivo</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><PRE CLASS="html" ><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="Send File" /> </form></PRE ></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > </P ><P > A "_URL_" no exemplo acima deve ser substituida e apontar para um arquivo PHP. O campo escondido <TT CLASS="literal" >MAX_FILE_SIZE</TT > (medido em bytes) deve preceder o campo de input do arquivo, e seu valor é o tamanho limite aceito para o arquivo. Também tenha certeza que seu formulário de upload de arquivo tenha <TT CLASS="literal" >enctype="multipart/form-data"</TT > em outro caso o upload do arquivo não irá funcionar. <DIV CLASS="warning" ><P ></P ><TABLE CLASS="warning" BORDER="1" WIDTH="100%" ><TR ><TD ALIGN="CENTER" ><B >Atenção</B ></TD ></TR ><TR ><TD ALIGN="LEFT" ><P > O valor de <TT CLASS="literal" >MAX_FILE_SIZE</TT > é 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. Mas você deve adicionar <TT CLASS="literal" >MAX_FILE_SIZE</TT > em qualquer caso, já que salva os usuários do problema de esperar por um grande arquivo ser transferido somente para descobrir depois de tudo que ele é muito grande. </P ></TD ></TR ></TABLE ></DIV > </P ><P > As variáveis definidas para o upload de arquivos são diferentes dependendo da versão e da configuração. A autoglobal <A HREF="reserved.variables.html#reserved.variables.files" >$_FILES</A > existe desde o PHP 4.1.0. A array <CODE CLASS="varname" >$HTTP_POST_FILES</CODE > existe desde o PHP 4.0.0. Estas array irão conter toda a informação do upload do arquivo. Usar <CODE CLASS="varname" >$_FILES</CODE > é preferido. Se a opção <A HREF="ini.core.html#ini.register-globals" >register_globals</A > é <SPAN CLASS="emphasis" ><I CLASS="emphasis" >on</I ></SPAN >, os nomes de variáveis relacionados também existirão. O padrão de <A HREF="ini.core.html#ini.register-globals" >register_globals</A > é <SPAN CLASS="emphasis" ><I CLASS="emphasis" >off</I ></SPAN > desde o PHP <A HREF="http://www.php.net/releases/4_2_0.php" TARGET="_top" >4.2.0</A >. </P ><P > Os conteúdos de <A HREF="reserved.variables.html#reserved.variables.files" >$_FILES</A > do nosso script de exemplo é como segue. Note que isso assume que o nome do upload do arquivo é <SPAN CLASS="emphasis" ><I CLASS="emphasis" >userfile</I ></SPAN >, como o usado no exemplo acima. Pode ser qualquer nome. <P ></P ><DIV CLASS="variablelist" ><DL ><DT ><CODE CLASS="varname" >$_FILES['userfile']['name']</CODE ></DT ><DD ><P > O nome original do arquivo no computador do usuário. </P ></DD ><DT ><CODE CLASS="varname" >$_FILES['userfile']['type']</CODE ></DT ><DD ><P > O tipo mime do arquivo, se o browser deu esta informação. Um exemplo pode ser <TT CLASS="literal" >"image/gif"</TT >. </P ></DD ><DT ><CODE CLASS="varname" >$_FILES['userfile']['size']</CODE ></DT ><DD ><P > O tamanho, em bytes, do arquivo. </P ></DD ><DT ><CODE CLASS="varname" >$_FILES['userfile']['tmp_name']</CODE ></DT ><DD ><P >O nome temporário do arquivo, como foi guardado no servidor. </P ></DD ><DT ><CODE CLASS="varname" >$_FILES['userfile']['error']</CODE ></DT ><DD ><P > O <A HREF="features.file-upload.errors.html" >código de erro</A > associado a este upload de arquivo. <SPAN CLASS="emphasis" ><I CLASS="emphasis" >['error']</I ></SPAN > foi adicionado no PHP 4.2.0 </P ></DD ></DL ></DIV > </P ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >Nota: </B > Em versões anteriores a 4.1.0 o nome era <CODE CLASS="varname" >$HTTP_POST_FILES</CODE > e não é uma variável <A HREF="language.variables.predefined.html#language.variables.superglobals" >autoglobal</A > como <CODE CLASS="varname" >$_FILES</CODE > é. PHP 3 não suporta <CODE CLASS="varname" >$HTTP_POST_FILES</CODE >. </P ></BLOCKQUOTE ></DIV ><P > Quando <A HREF="ini.core.html#ini.register-globals" >register_globals</A > esta em <SPAN CLASS="emphasis" ><I CLASS="emphasis" >on</I ></SPAN > no <TT CLASS="filename" >php.ini</TT >, variáveis adicionais estão disponíveis. Por exemplo, <CODE CLASS="varname" >$userfile_name</CODE > será igual a <CODE CLASS="varname" >$_FILES['userfile']['name']</CODE >, <CODE CLASS="varname" >$userfile_type</CODE > será igual a <CODE CLASS="varname" >$_FILES['userfile']['type']</CODE >, etc. Lembre-se que desde o PHP 4.2.0, o padrão para register_globals é off. É preferível não depender desta opção. </P ><P > Os arquivos serão guardados no diretório temporário do servidor, a menos que outro lugar seja especificado com a opção <A HREF="ini.core.html#ini.upload-tmp-dir" >upload_tmp_dir</A > no <TT CLASS="filename" >php.ini</TT >. O diretório padrão do servidor pode ser mudado se mudando o valor da variável de ambiente <CODE CLASS="envar" >TMPDIR</CODE > no ambiente onde o PHP esta sendo executado PHP. Mudando-a com <A HREF="function.putenv.html" ><B CLASS="function" >putenv()</B ></A > 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. </P ><P > Note que deve se definir <A HREF="ini.core.html#ini.upload-tmp-dir" >upload_temp_dir</A > no <TT CLASS="filename" >php.ini</TT > ou <CODE CLASS="envar" >TMPDIR</CODE >, não podendo estarem ambos vazios, sendo recomendado no mínimo upload_tmp_dir. </P ><TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN6968" ></A ><P ><B >Exemplo 38-2. Validando o upload de arquivos</B ></P ><P > Veja também as funções <A HREF="function.is-uploaded-file.html" ><B CLASS="function" >is_uploaded_file()</B ></A > e <A HREF="function.move-uploaded-file.html" ><B CLASS="function" >move_uploaded_file()</B ></A > para maiores informações. O seguinte exemplo irá processar o envio de um arquivo que vem de um formulário. </P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#FF8000">// Nas versões do PHP anteriores a 4.1.0, deve ser usado $HTTP_POST_FILES<br />// ao invés de $_FILES.<br /><br /></font><font color="#0000BB">$uploaddir </font><font color="#007700">= </font><font color="#DD0000">'/var/www/uploads/'</font><font color="#007700">;<br /></font><font color="#0000BB">$uploadfile </font><font color="#007700">= </font><font color="#0000BB">$uploaddir </font><font color="#007700">. </font><font color="#0000BB">$_FILES</font><font color="#007700">[</font><font color="#DD0000">'userfile'</font><font color="#007700">][</font><font color="#DD0000">'name'</font><font color="#007700">];<br />print </font><font color="#DD0000">"<pre>"</font><font color="#007700">;<br />if (</font><font color="#0000BB">move_uploaded_file</font><font color="#007700">(</font><font color="#0000BB">$_FILES</font><font color="#007700">[</font><font color="#DD0000">'userfile'</font><font color="#007700">][</font><font color="#DD0000">'tmp_name'</font><font color="#007700">], </font><font color="#0000BB">$uploaddir </font><font color="#007700">. </font><font color="#0000BB">$_FILES</font><font color="#007700">[</font><font color="#DD0000">'userfile'</font><font color="#007700">][</font><font color="#DD0000">'name'</font><font color="#007700">])) {<br /> print </font><font color="#DD0000">"O arquivo é valido e foi carregado com sucesso. Aqui esta alguma informação:\n"</font><font color="#007700">;<br /> </font><font color="#0000BB">print_r</font><font color="#007700">(</font><font color="#0000BB">$_FILES</font><font color="#007700">);<br />} else {<br /> print </font><font color="#DD0000">"Possivel ataque de upload! Aqui esta alguma informação:\n"</font><font color="#007700">;<br /> </font><font color="#0000BB">print_r</font><font color="#007700">(</font><font color="#0000BB">$_FILES</font><font color="#007700">);<br />}<br />print </font><font color="#DD0000">"</pre>"</font><font color="#007700">;<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ><P > 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 <CODE CLASS="varname" >$_FILES['userfile']['size']</CODE > para descartar qualquer arquivo que seja muito pequeno ou muito grande. Você pode usar a variável <CODE CLASS="varname" >$_FILES['userfile']['type']</CODE > que não sejam de um certo tipo. Desde o PHP 4.2.0, você pode usar <CODE CLASS="varname" >$_FILES['userfile']['error']</CODE > e planejar a sua lógica de acordo com os <A HREF="features.file-upload.errors.html" >códigos de erro</A >. Qualquer que seja a lógica, você deve excluir o arquivo do diretório temporário ou move-lo para outro lugar. </P ><P > Se nenhum arquivo for selecionado em seu formulário, o PHP irá retornar <CODE CLASS="varname" >$_FILES['userfile']['size']</CODE > como 0, e <CODE CLASS="varname" >$_FILES['userfile']['tmp_name']</CODE > como none. </P ><P > O arquivo será excluído do diretório temporário ao fim do script se não tiver sido movido ou renomeado. </P ></DIV ></DIV ><DIV CLASS="NAVFOOTER" ><HR ALIGN="LEFT" WIDTH="100%"><TABLE SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><A HREF="features.xforms.html" ACCESSKEY="P" >Anterior</A ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="index.html" ACCESSKEY="H" >Principal</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><A HREF="features.file-upload.errors.html" ACCESSKEY="N" >Próxima</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >Lidando com XForms</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="features.html" ACCESSKEY="U" >Acima</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >Explicação das mensagens de erro</TD ></TR ></TABLE ></DIV ></BODY ></HTML >