<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML ><HEAD ><TITLE >Suporte ao método PUT</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="Gerenciar o upload de arquivos" HREF="features.file-upload.html"><LINK REL="PREVIOUS" TITLE="Carregando múltiplos arquivos" HREF="features.file-upload.multiple.html"><LINK REL="NEXT" TITLE="Usando arquivos remotos" HREF="features.remote-files.html"><META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8"></HEAD ><BODY CLASS="sect1" 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.file-upload.multiple.html" ACCESSKEY="P" >Anterior</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" >Capítulo 38. Gerenciar o upload de arquivos</TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="features.remote-files.html" ACCESSKEY="N" >Próxima</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="sect1" ><H1 CLASS="sect1" ><A NAME="features.file-upload.put-method" >Suporte ao método PUT</A ></H1 ><P > O suporte ao método PUT mudou entre PHP 3 e PHP 4. No PHP 4, deve se usar a entrada padrão para ler os conteúdos de um PUT. </P ><P > <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN7086" ></A ><P ><B >Exemplo 38-4. Salvando arquivos HTTP PUT com o PHP 4</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#FF8000">/* PUT data vem do stdin stream */<br /></font><font color="#0000BB">$putdata </font><font color="#007700">= </font><font color="#0000BB">fopen</font><font color="#007700">(</font><font color="#DD0000">"php://stdin"</font><font color="#007700">, </font><font color="#DD0000">"r"</font><font color="#007700">);<br /><br /></font><font color="#FF8000">/* Abre um arquivo para escrita */<br /></font><font color="#0000BB">$fp </font><font color="#007700">= </font><font color="#0000BB">fopen</font><font color="#007700">(</font><font color="#DD0000">"myputfile.ext"</font><font color="#007700">, </font><font color="#DD0000">"w"</font><font color="#007700">);<br /><br /></font><font color="#FF8000">/* Lê os dados 1KB de cada vez<br /> e escreve no arquivo */<br /></font><font color="#007700">while (</font><font color="#0000BB">$data </font><font color="#007700">= </font><font color="#0000BB">fread</font><font color="#007700">(</font><font color="#0000BB">$putdata</font><font color="#007700">,</font><font color="#0000BB">1024</font><font color="#007700">))<br /> </font><font color="#0000BB">fwrite</font><font color="#007700">(</font><font color="#0000BB">$fp</font><font color="#007700">,</font><font color="#0000BB">$data</font><font color="#007700">);<br /><br /></font><font color="#FF8000">/* Fecha os streams */<br /></font><font color="#0000BB">fclose</font><font color="#007700">(</font><font color="#0000BB">$fp</font><font color="#007700">);<br /></font><font color="#0000BB">fclose</font><font color="#007700">(</font><font color="#0000BB">$putdata</font><font color="#007700">);<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > </P ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >Nota: </B > Toda a documentação abaixo aplica-se ao PHP 3 somente. </P ></BLOCKQUOTE ></DIV ><P > PHP prove suporte para o método HTTP PUT usado por clientes como <SPAN CLASS="productname" >Netscape Composer</SPAN > e W3C <SPAN CLASS="productname" >Amaya</SPAN >. Requisições PUT são muito mais simples do que o upload de arquivo e se parecem com isto: <DIV CLASS="informalexample" ><P ></P ><A NAME="AEN7094" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><PRE CLASS="programlisting" >PUT /path/filename.html HTTP/1.1</PRE ></TD ></TR ></TABLE ><P ></P ></DIV > </P ><P > Isto normalmente indica que o cliente remoto gostaria de salvar o conteúdo que se segue como: <TT CLASS="filename" >/path/filename.html</TT > na sua arvore web. É obvio que não é uma boa idéia para o Apache ou o PHP automaticamente permitir que todos possam sobrescrever arquivos na sua arvore web. Então, para manusear este tipo de requisição você tem primeiro que dizer ao seu servidor web que você quer que um certo script PHP cuide da requisição. No apache você faz isto com a diretiva <SPAN CLASS="emphasis" ><I CLASS="emphasis" >Script</I ></SPAN >. Pode ser colocada praticamente em qualquer lugar do seu arquivo de configuração do Apache. Um lugar comum é dentro de um bloco <Directory> ou talvez dentro de um bloco <Virtualhost>. Uma linha como esta deve fazer o truque: <DIV CLASS="informalexample" ><P ></P ><A NAME="AEN7099" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><PRE CLASS="programlisting" >Script PUT /put.php</PRE ></TD ></TR ></TABLE ><P ></P ></DIV > </P ><P > Isto diz para o apache enviar todas as requisições PUT que estejam no contexto que você colocou esta linha para o script put.php. Isto assume, é claro, que você tem o PHP ativado para a extensão .php e que o PHP esta ativo. </P ><P > Dentro do seu arquivo put.php você deve então fazer algo parecido com isto: </P ><P > <DIV CLASS="informalexample" ><P ></P ><A NAME="AEN7104" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php copy</font><font color="#007700">(</font><font color="#0000BB">$PHP_UPLOADED_FILE_NAME</font><font color="#007700">, </font><font color="#0000BB">$DOCUMENT_ROOT </font><font color="#007700">. </font><font color="#0000BB">$REQUEST_URI</font><font color="#007700">); </font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV > </P ><P > Isto deve copiar o arquivo para a localização requisitada pelo cliente remoto. Você provavelmente quer fazer alguma checagem e/ou autenticar o usuário antes de fazer esta copia de arquivo. O único truque aqui é que quando o php vê uma requisição com o método PUT ele guarda o arquivo carregado em um arquivo temporário justo como se fosse manuseado pelo método <A HREF="features.file-upload.html#features.file-upload.post-method" >POST</A >. Quando a requisição termina, este arquivo temporário é apagado. Assim seu script de manuseio do PUT tem que copiar este arquivo em outro lugar. O nome deste arquivo temporário esta na variável <CODE CLASS="varname" >$PHP_PUT_FILENAME</CODE >, e você pode ver o nome de arquivo de destino sugerido em <CODE CLASS="varname" >$REQUEST_URI</CODE > (deve variar em servidores diferentes do apache). Este nome do arquivo de destino é o que o cliente remoto especificou. Você não tem que ouvir o cliente. Você pode, por exemplo, copiar todos os arquivos carregados para um diretório especial de uploads. </P ></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.file-upload.multiple.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.remote-files.html" ACCESSKEY="N" >Próxima</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >Carregando múltiplos arquivos</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="features.file-upload.html" ACCESSKEY="U" >Acima</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >Usando arquivos remotos</TD ></TR ></TABLE ></DIV ></BODY ></HTML >