1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234
|
<?xml version="1.0" encoding="iso-8859-1"?>
<chapter id="features.file-upload">
<title>El envío de archivos</title>
<sect1 id="features.file-upload.post-method">
<title>Envío de archivos con el método POST</title>
<simpara>
PHP es capaz de recibir envíos de archivo de cualquier navegador
que cumpla la norma RFC-1867 (entre los que se incluyen Netscape
Navigator 3 o posterior, Microsoft Internet Explorer 3 con un
parche o posterior sin éste). Ésta característica permite que los
usuarios envien archivos de texto y binarios. Mediante la
autentificación y funciones de manejo de archivos de PHP, es
posible un control total de quién puede enviar archivos y que se
hace con éstos una vez recibidos.
</simpara>
<para>
Es importante destacar que PHP también soporta el método PUT
para envío de archivos tal y como lo utiliza Netscape Composer
y el cliente Amaya de W3C. Consulte <link linkend="features.file-upload.put-method">Soporte del método PUT</link> para más detalles.</para>
<para>
Una página de envío de archivos se puede crear mediante un formulario
parecido a éste:
<example>
<title>Formulario de envío de archivo</title>
<programlisting>
&lt;FORM ENCTYPE=&quot;multipart/form-data&quot; ACTION=&quot;_URL_&quot; METHOD=POST&gt;
&lt;INPUT TYPE=&quot;hidden&quot; name=&quot;MAX_FILE_SIZE&quot; value=&quot;1000&quot;&gt;
Enviar este archivo: &lt;INPUT NAME=&quot;userfile&quot; TYPE=&quot;file&quot;&gt;
&lt;INPUT TYPE=&quot;submit&quot; VALUE=&quot;Enviar&quot;&gt;
&lt;/FORM&gt;
</programlisting>
</example>
La _URL_ debe tener como destino un script PHP. El campo MAX_FILE_SIZE
debe encontrarse antes del campo INPUT y su valor determina el tamaño
máximo de archivo que se puede enviar en bytes. Tras la recepción del
archivo se definirán en el script PHP destino las siguientes variables:
</para>
<para>
<itemizedlist>
<listitem>
<simpara>
$userfile - El archivo temporal que se ha guardado en el servidor.
</simpara>
</listitem>
<listitem>
<simpara>
$userfile_name - El nombre original del archivo enviado.
</simpara>
</listitem>
<listitem>
<simpara>
$userfile_size - El tamaño del archivo recibido.
</simpara>
</listitem>
<listitem>
<simpara>
$userfile_type - El tipo mime del archivo si el navigador
envio esta información. Por ejemplo:
&quot;image/gif&quot;.
</simpara>
</listitem>
</itemizedlist>
Es importante recordar que la primera palabra &quot;$userfile&quot;
de éstas variables corresponde al nombre ("NAME=") del campo
"INPUT TYPE=file" del formulario. En el ejemplo anterior usamos
&quot;userfile&quot;.</para>
<simpara>
Los archivos enviados serán guardados en el directorio temporal por
defecto del servidor. Podemos variar este directorio mediante la
variable de entorno <envar>TMPDIR</envar> en el entorno donde
corre PHP. No se puede establecer este valor usando <function>putenv</function>
desde un script PHP.
</simpara>
<simpara>
El script PHP que recibe el archivo enviado debe implementar
las acciones que se deben llevar a cabo con el archivo acabado
de recibir. Por ejemplo se podria utilizar $file_size para
decidir descartar los archivos que sean demadiado pequeños o
demasiado grandes. Sean cual sean las acciones a tomar se debe
borrar el archivo temporal o moverlo a algún otro directorio.
</simpara>
<simpara>
El archivo recibido será eliminado inmediatamente del directorio
temporal al finalizar el script PHP que lo recibió si no ha sido
movido o renombrado.
</simpara>
</sect1>
<sect1 id="features.file-upload.common-pitfalls">
<title>Errores comunes</title>
<simpara>
El valor de MAX_FILE_SIZE no puede ser mayor que el tamaño del archivo
que se especifica en la variable upload_max_filesize del archivo
PHP3.ini o la correspondiente directiva php3_upload_max_filesize de
Apache. Por defecto es 2 Megabytes.</simpara>
<simpara>
El servidor CERN parece que elimina cualquier cosa antes del primer
espacio en blanco en la cabecera mime content-type que recibe de los
clientes. Mientras esto no varie, CERN httpd no podrá soportar el
envío de archivos.</simpara>
</sect1>
<sect1 id="feature-fileupload.multiple">
<title>Envío de más de un archivo</title>
<simpara>
Es posible el envio de varios archivos simultáneamente y poder
clasificar la información automáticamente por arrays. Esto de
hace de la misma manera en que se organizan por arrays los
SELECT o CHECKBOX:</simpara>
<note>
<para>
El soporte para múltiple envios de archivos se añadió en la versión 3.0.10</para>
</note>
<para>
<example>
<title>Formulario de envío multiple de archivos</title>
<programlisting>
&lt;form action=&quot;file-upload.html&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&gt;
Enviar estos archivos:&lt;br&gt;
&lt;input name=&quot;userfile[]&quot; type=&quot;file&quot;&gt;&lt;br&gt;
&lt;input name=&quot;userfile[]&quot; type=&quot;file&quot;&gt;&lt;br&gt;
&lt;input type=&quot;submit&quot; value=&quot;Enviar&quot;&gt;
&lt;/form&gt;
</programlisting>
</example></para>
<simpara>
Cuando el formulario es procesado, los arrays <computeroutput>$userfile</computeroutput>,
<computeroutput>$userfile_name</computeroutput>, y
<computeroutput>$userfile_size</computeroutput> se crearán de alcance
global (igual que $HTTP_POST_VARS). Cada uno será un array con
índice numérico con los valores apropiados para los archivos
enviados.</simpara>
<simpara>
Por ejemplo, supongamos que los siguientes archivos
<filename>/home/test/review.html</filename> y
<filename>/home/test/xwp.out</filename> son enviados. En este
caso, <computeroutput>$userfile_name[0]</computeroutput> almacenaría
el valor <computeroutput>review.html</computeroutput>, y
<computeroutput>$userfile_name[1]</computeroutput> almacenaría el
valor <computeroutput>xwp.out</computeroutput>. Así,
<computeroutput>$userfile_size[0]</computeroutput> almacenaría el
tamaño de <filename>review.html</filename> y así con los valores
siguientes.</simpara></sect1>
<sect1 id="features.file-upload.put-method">
<title>Soporte del método PUT</title>
<para>
PHP soporta el metodo HTTP PUT que usan aplicaciones como Netscape
Composer y Amaya de W3C. Las peticiones PUT son más sencillas que
el método POST. Un ejemplo:
<informalexample><programlisting>
PUT /path/filename.html HTTP/1.1
</programlisting></informalexample>
</para>
<para>
Esto normalmente significaría que el cliente remoto quiere salvar
el contenido como: /path/filename.html en tu árbol web. Lógicamente
no una buena idea que la gente pueda escribir en tu árbol web. Para
manipular esta petición debes decirle al servidor que esta petición
sea atendida por un script PHP. En Apache, por ejemplo, se utiliza
para esto la directiva <emphasis>Script</emphasis> en los alguno
de los archivos de configuración del servidor. Un sitio típico de
uso es dentro del bloque &lt;Directory&gt; o quizás en el
bloque &lt;Virtualhost&gt;. Una linia así deberia hacer ésta
función:
<informalexample><programlisting>
Script PUT /put.php3
</programlisting></informalexample>
</para>
<simpara>
Ésto le dice a Apache que envie todas peticiones PUT para URIs que
contengan esta linia al script put.php3. Se asume que PHP se
encuentra activo y con la extension php3 enlazada a él.
</simpara>
<simpara>
Dentro del script put.php3 se podría implementar algo así:
</simpara>
<para>
<informalexample><programlisting>
&lt;? copy($PHP_UPLOADED_FILE_NAME,$DOCUMENT_ROOT.$REQUEST_URI); ?&gt;
</programlisting></informalexample>
</para>
<simpara>
Esto copiaria el archivo a la localización requerida por el cliente
remoto. Aqui se pueden ejecutar funciones de autentificación de
usuario o cualquier otro tipo de chequeo. El archivo se guarda en
el archivo temporal del sistema servidor de la misma manera que el
<link linkend="features.file-upload.post-method">Método POST</link>.
Cuando la petición finaliza, el archivo temporal es eliminado. En
consequencia el script dede proceder al trato de éste inmediatamente,
ya sea para copiarlo, renombrarlo, etc. El archivo se encuentra en
la variable $PHP_PUT_FILENAME, y el destino sugerido por el cliente
en la variable $REQUEST_URI (puede variar en servidores diferentes de
Apache). No es necesario hacer caso al destino sugerido por el cliente.
Por ejemplo se podrían copiar los archivos enviados a directorios
especialmente designados para esta tarea.</simpara></sect1>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->
|