File: file-upload.xml

package info (click to toggle)
phpdoc 20020310-1
  • links: PTS
  • area: main
  • in suites: woody
  • size: 35,272 kB
  • ctags: 354
  • sloc: xml: 799,767; php: 1,395; cpp: 500; makefile: 200; sh: 140; awk: 51
file content (234 lines) | stat: -rwxr-xr-x 10,241 bytes parent folder | download
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&iacute;o de archivos</title>

  <sect1 id="features.file-upload.post-method">
   <title>Env&iacute;o de archivos con el m&eacute;todo POST</title>

   <simpara>
    PHP es capaz de recibir env&iacute;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 &eacute;ste). &Eacute;sta caracter&iacute;stica permite que los
    usuarios envien archivos de texto y binarios. Mediante la 
    autentificaci&oacute;n y funciones de manejo de archivos de PHP, es
    posible un control total de qui&eacute;n puede enviar archivos y que se
    hace con &eacute;stos una vez recibidos.
   </simpara>

   <para>
    Es importante destacar que PHP tambi&eacute;n soporta el m&eacute;todo PUT
    para env&iacute;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&eacute;todo PUT</link> para m&aacute;s detalles.</para>

   <para>
    Una p&aacute;gina de env&iacute;o de archivos se puede crear mediante un formulario
    parecido a &eacute;ste:

    <example>
     <title>Formulario de env&iacute;o de archivo</title>
     <programlisting>
&amp;lt;FORM ENCTYPE=&amp;quot;multipart/form-data&amp;quot; ACTION=&amp;quot;_URL_&amp;quot; METHOD=POST&amp;gt;
&amp;lt;INPUT TYPE=&amp;quot;hidden&amp;quot; name=&amp;quot;MAX_FILE_SIZE&amp;quot; value=&amp;quot;1000&amp;quot;&amp;gt;
Enviar este archivo: &amp;lt;INPUT NAME=&amp;quot;userfile&amp;quot; TYPE=&amp;quot;file&amp;quot;&amp;gt;
&amp;lt;INPUT TYPE=&amp;quot;submit&amp;quot; VALUE=&amp;quot;Enviar&amp;quot;&amp;gt;
&amp;lt;/FORM&amp;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&ntilde;o
    m&aacute;ximo de archivo que se puede enviar en bytes. Tras la recepci&oacute;n del
    archivo se definir&aacute;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&ntilde;o del archivo recibido.
      </simpara>
     </listitem>
     <listitem>
      <simpara>
       $userfile_type - El tipo mime del archivo si el navigador
       envio esta informaci&oacute;n. Por ejemplo:
       &amp;quot;image/gif&amp;quot;.
      </simpara>
     </listitem>
    </itemizedlist>
    
    Es importante recordar que la primera palabra &amp;quot;$userfile&amp;quot;
    de &eacute;stas variables corresponde al nombre ("NAME=") del campo 
    "INPUT TYPE=file" del formulario. En el ejemplo anterior usamos
    &amp;quot;userfile&amp;quot;.</para>

   <simpara>
    Los archivos enviados ser&aacute;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&ntilde;os o
    demasiado grandes. Sean cual sean las acciones a tomar se debe
    borrar el archivo temporal o moverlo a alg&uacute;n otro directorio.
    </simpara>

   <simpara>
    El archivo recibido ser&aacute; eliminado inmediatamente del directorio
    temporal al finalizar el script PHP que lo recibi&oacute; 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&ntilde;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&aacute; soportar el 
    env&iacute;o de archivos.</simpara>
  </sect1>

  <sect1 id="feature-fileupload.multiple">
   <title>Env&iacute;o de m&aacute;s de un archivo</title>
   <simpara>
    Es posible el envio de varios archivos simult&aacute;neamente y poder
    clasificar la informaci&oacute;n autom&aacute;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&uacute;ltiple envios de archivos se a&ntilde;adi&oacute; en la versi&oacute;n 3.0.10</para>
    </note>

   <para>
    <example>
     <title>Formulario de env&iacute;o multiple de archivos</title>
     <programlisting>
&amp;lt;form action=&amp;quot;file-upload.html&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;
  Enviar estos archivos:&amp;lt;br&amp;gt;
  &amp;lt;input name=&amp;quot;userfile[]&amp;quot; type=&amp;quot;file&amp;quot;&amp;gt;&amp;lt;br&amp;gt;
  &amp;lt;input name=&amp;quot;userfile[]&amp;quot; type=&amp;quot;file&amp;quot;&amp;gt;&amp;lt;br&amp;gt;
  &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enviar&amp;quot;&amp;gt;
&amp;lt;/form&amp;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&aacute;n de alcance
    global (igual que $HTTP_POST_VARS). Cada uno ser&aacute; un array con
    &iacute;ndice num&eacute;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&iacute;a
    el valor <computeroutput>review.html</computeroutput>, y
    <computeroutput>$userfile_name[1]</computeroutput> almacenar&iacute;a el
    valor <computeroutput>xwp.out</computeroutput>. As&iacute;,
    <computeroutput>$userfile_size[0]</computeroutput> almacenar&iacute;a el
    tama&ntilde;o de <filename>review.html</filename> y as&iacute; con los valores
    siguientes.</simpara></sect1>

  <sect1 id="features.file-upload.put-method">
   <title>Soporte del m&eacute;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&aacute;s sencillas que
    el m&eacute;todo POST. Un ejemplo:

    <informalexample><programlisting>
PUT /path/filename.html HTTP/1.1
    </programlisting></informalexample>
   </para>

   <para>
    Esto normalmente significar&iacute;a que el cliente remoto quiere salvar
    el contenido como: /path/filename.html en tu &aacute;rbol web. L&oacute;gicamente
    no una buena idea que la gente pueda escribir en tu &aacute;rbol web. Para
    manipular esta petici&oacute;n debes decirle al servidor que esta petici&oacute;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&oacute;n del servidor. Un sitio t&iacute;pico de
    uso es dentro del bloque &amp;lt;Directory&amp;gt; o quiz&aacute;s en el
    bloque &amp;lt;Virtualhost&amp;gt;. Una linia as&iacute; deberia hacer &eacute;sta
    funci&oacute;n:

    <informalexample><programlisting>
Script PUT /put.php3
    </programlisting></informalexample>
   </para>

   <simpara>
    &Eacute;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 &eacute;l.
   </simpara>
   <simpara>
    Dentro del script put.php3 se podr&iacute;a implementar algo as&iacute;:
   </simpara>
   <para>
    <informalexample><programlisting>
&amp;lt;? copy($PHP_UPLOADED_FILE_NAME,$DOCUMENT_ROOT.$REQUEST_URI); ?&amp;gt;
    </programlisting></informalexample>
   </para>
   <simpara>
    Esto copiaria el archivo a la localizaci&oacute;n requerida por el cliente
    remoto. Aqui se pueden ejecutar funciones de autentificaci&oacute;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&eacute;todo POST</link>.
    Cuando la petici&oacute;n finaliza, el archivo temporal es eliminado. En
    consequencia el script dede proceder al trato de &eacute;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&iacute;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:
-->