cortesi Tue May 28 15:03:48 2002 EDT Modified files: /phpdoc-it/features file-upload.xml Log: adding translation by Enrico Donelli
Index: phpdoc-it/features/file-upload.xml diff -u /dev/null phpdoc-it/features/file-upload.xml:1.5 --- /dev/null Tue May 28 15:03:48 2002 +++ phpdoc-it/features/file-upload.xml Tue May 28 15:03:46 2002 @@ -0,0 +1,391 @@ +<?xml version="1.0" encoding="iso-8859-1"?> +<!-- EN-Revision: 1.27 Maintainer: donelli Status: ready --> + <chapter id="features.file-upload"> + <title>Caricare file</title> + + <sect1 id="features.file-upload.post-method"> + <title>Metodo POST per caricamento di file</title> + + <simpara> + PHP è in grado di ricevere file caricati da qualsiasi browser compatibile + con le specifiche RFC-1867 (che comprende Netscape Navigator 3 o successivo, + Microsoft Internet Explorer 3 con una modifica di Microsoft, o + versioni successive senza modifica). Questa caratteristica permette di caricare +sia file di testo + che binari. Utilizzando le funzioni di PHP per l'autenticazione e manipolazione +dei file, + è possibile avere pieno controllo su chi ha i permessi per caricare un file e su + ciò che deve essere fatto una volta che il file è stato caricato. + </simpara> + <para> + Si noti che PHP permette l'upload di file con metodo PUT come utilizzato dai + programmi Netscape Composer e W3C Amaya. Si veda <link + linkend="features.file-upload.put-method">Supporto per metodo PUT + </link> per maggiori dettagli. + </para> + <para> + La schermata di caricamento di un file può essere costruita con una form + particolare, di questo tipo: + <example> + <title>Form di caricamento file</title> + <programlisting role="html"> +<![CDATA[ +<form enctype="multipart/form-data" action="_URL_" method="post"> +<input type="hidden" name="MAX_FILE_SIZE" value="1000"> +Invia questo file: <input name="userfile" type="file"> +<input type="submit" value="Invia File"> +</form> +]]> + </programlisting> + </example> + Il valore della action _URL_ dovrebbe puntare a un file PHP. Il campo nascosto +MAX_FILE_SIZE + deve precedere il campo di immisione del file e il suo valore è la + dimensione massima accettata del file. Il valore è in byte. + <warning> + <para> + Il valore MAX_FILE_SIZE è consigliato al browser. E' facile aggirare + questo valore, quindi non fate affidamento sul fatto che il + navigatore si comporti come desiderato! L'impostazione PHP lato server per la +dimensione + massima non può comunque essere aggirata. + </para> + </warning> + </para> + + <para> + In PHP, le seguenti variabili sono definite all'interno dello script di + destinazione a seguito di un upload terminato con successo, nell'ipotesi + che l'impostazione <link + linkend="ini.register-globals">register_globals</link> sia attiva + nel file <filename>php.ini</filename>. Se l'impostazione <link + linkend="ini.track-vars">track_vars</link> è attiva, le variabili saranno attive + in PHP nell'array globale <varname>$HTTP_POST_VARS</varname>. + Notate che i nomi delle variabili seguenti si basano sull'ipotesi che + abbiate chiamato il file di cui fare l'upload 'userfile' come nell'esempio +precedente: + + <itemizedlist> + <listitem> + <simpara> + <varname>$userfile</varname> - Il file temporaneo in cui il file caricato + è salvato sul server. + </simpara> + </listitem> + <listitem> + <simpara> + <varname>$userfile_name</varname> - Il nome originale o percorso del file + sulla macchina dell'utente. + </simpara> + </listitem> + <listitem> + <simpara> + <varname>$userfile_size</varname> - La dimensione del file caricato in + bytes. + </simpara> + </listitem> + <listitem> + <simpara> + <varname>$userfile_type</varname> - Il mime-type del file, + se il browser fornisce questa informazione. Un esempio può + essere "image/gif". + </simpara> + </listitem> + </itemizedlist> + Si noti che la parte "$userfile" della variabile precedente è + specificata nel campo INPUT TYPE=file nella form di upload. + Nell'esempio precedente dell'upload, è stata chiamata + "userfile" + </para> + + <para> + In PHP 4 il comportamento è leggermente differente, perché è disponibile il nuovo + array globale <varname>$HTTP_POST_FILES</varname> che contiene le + informazioni sul file caricato. Questo è disponibile solo se la variabile + <link linkend="ini.track-vars">track_vars</link> è attiva, ma + <link linkend="ini.track-vars">track_vars</link> è sempre attiva + dalle versioni successive alla PHP 4.0.2. + </para> + + <para> + Il contentuto dell'array <varname>$HTTP_POST_FILES</varname> è riportato + di seguito. Si noti che che questo ipotizza l'uso del nome del file caricato + 'userfile', come nell'esempio precedente: + <variablelist> + <varlistentry> + <term><varname>$HTTP_POST_FILES['userfile']['name']</varname></term> + <listitem> + <para> + Il nome originale del file sulla macchina dell'utente. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><varname>$HTTP_POST_FILES['userfile']['type']</varname></term> + <listitem> + <para> + Il mime-type del file, se il browser fornisce questa informazione. + Un esempio potrebbe essere <literal>"image/gif"</literal>. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><varname>$HTTP_POST_FILES['userfile']['size']</varname></term> + <listitem> + <para> + La dimensione, in bytes, del file caricato. + </para> + </listitem> + </varlistentry> + <varlistentry> + <term><varname>$HTTP_POST_FILES['userfile']['tmp_name']</varname></term> + <listitem> + <para> + Il nome del file temporaneo in cui il file caricato è salvato + sul server. + </para> + </listitem> + </varlistentry> + </variablelist> + </para> + + <para> + I file sono, di default, salvati in una directory temporanea sul server, a meno + che un diverso percorso sia specificato nella direttiva <link + linkend="ini.upload-tmp-dir">upload_tmp_dir</link> nel file + <filename>php.ini</filename>. La directory del server predefinita può essere + cambiata impostando la variabile di ambiente <envar>TMPDIR</envar> in cui + è in esecuzione PHP. Non è possibile impostare questa variabile utilizzando + la funzione <function>putenv</function> da uno script PHP. + Questa variabile di ambiente può anche essere usata per assicurarsi che + anche altre operazioni stiano lavorando sui file caricati. + <example> + <title>Verifica dell'upload di file</title> + <para> + Gli esempi seguenti valgono per versioni di PHP 3 maggiori di + 3.0.16, e versioni di PHP 4 maggiorni di 4.0.2. Si vedano le definizioni + delle funzioni <function>is_uploaded_file</function> e + <function>move_uploaded_file</function>. + </para> + <programlisting role="php"> +<![CDATA[ +<?php +if (is_uploaded_file($userfile)) { + copy($userfile, "/place/to/put/uploaded/file"); +} else { + echo "Possibile attacco nell'upload del file: filename '$userfile'."; +} +/* ...or... */ +move_uploaded_file($userfile, "/posto/dove/mettere/file/caricato"); +?> +]]> + </programlisting> + <para> + Per le versioni precedenti di PHP è necessario fare come descritto + in seguito. + <note> + <para> + Questo <emphasis>non</emphasis> funziona con le versioni di PHP 4 + successive alla 4.0.2. Dipende da funzionalità interne del PHP cambiate + dopo quella versione. + </para> + </note> + </para> + <programlisting role="php"> +<![CDATA[ +<?php +/* Userland test for uploaded file. */ +function is_uploaded_file($filename) { + if (!$tmp_file = get_cfg_var('upload_tmp_dir')) { + $tmp_file = dirname(tempnam('', '')); + } + $tmp_file .= '/' . basename($filename); + /* User might have trailing slash in php.ini... */ + return (ereg_replace('/+', '/', $tmp_file) == $filename); +} + +if (is_uploaded_file($userfile)) { + copy($userfile, "/posto/dove/mettere/file/caricato"); +} else { + echo "Possibile attacco nell'upload del file: filename '$userfile'."; +} +?> +]]> + </programlisting> + </example> + </para> + <simpara> + Lo script PHP che riceve il file caricato dovrebbe implementare la + logica necessaria per determinare cosa deve essere fatto con il file + caricato. E' possibile, per esempio, utilizzare la variabile + <varname>$file_size</varname> per eliminare file che siano troppo + grandi o troppo piccoli. E' possibile utillizzare la variabile + <varname>$file_type</varname> per eliminare tutti i file che nono sodisfano + certi criteri. Quale che sia la logica, bisognerebbe comunque sempre + cancellare il file dalla directory temporanea e spostarlo da qualche + altra parte. + </simpara> + <simpara> + Il file sarà eliminato dalla directory temporanea al termine della richiesta + se non è stato mosso e rinominato. + </simpara> + </sect1> + + <sect1 id="features.file-upload.common-pitfalls"> + <title>Common Pitfalls</title> + <simpara> + La voce <literal>MAX_FILE_SIZE</literal> non può specificare una dimensione del + file maggiore di quella impostata dal parametro <link + linkend="ini.upload-max-filesize">upload_max_filesize</link> del file php.ini. + L'impostazione di default è 2 Megabytes. + </simpara> + <simpara> + Non controllare il file su cui si sta operando potrebbe dare agli utenti + accesso a informazioni sensibili contenute in altre directory. + </simpara> + <simpara> + Si noti che che il server http CERN sembra eliminare qualsiasi cosa a partire + dal primo spazio nell'header mime content-type che riceve dal client. + Fino a che questo si verificherà, il server http CERN non supporterà la +possibilità + di caricare file. + </simpara> + </sect1> + + <sect1 id="features.file-upload.multiple"> + <title>Caricamento di più file</title> + <simpara> + E' possibile caricare più file contemporaneamente e avere + le informazioni organizzate automaticamente in array. Per questo + è necessario utilizzare la medesima sintassi di invio di array da form HTML che + è utilizzata con select e checkbox multipli: + </simpara> + <note> + <para> + Il supporto per il caricamento di file multipli è presente dalla versione 3.0.10. + </para> + </note> + <para> + <example> + <title>Caricamento di più file</title> + <programlisting role="html"> +<![CDATA[ +<form action="file-upload.php" method="post" enctype="multipart/form-data"> + Send these files:<br> + <input name="userfile[]" type="file"><br> + <input name="userfile[]" type="file"><br> + <input type="submit" value="Send files"> +</form> +]]> + </programlisting> + </example> + </para> + <simpara> + Quando la form è inviata, gli array + <varname>$userfile</varname>, + <varname>$userfile_name</varname>, e + <varname>$userfile_size</varname> sono costruiti con visibilità + globale (così come in $HTTP_POST_FILES ($HTTP_POST_VARS + in PHP 3)). Ognuno di questi è un array indicizzato numericamente + con i valori relativi ai diversi file caricati. + </simpara> + <simpara> + Per esempio, si supponga che i nomi di file + <filename>/home/test/review.html</filename> e + <filename>/home/test/xwp.out</filename> siano inviati. In questo + caso, <varname>$userfile_name[0]</varname> conterrebbe + il valore <filename>review.html</filename>, + e <varname>$userfile_name[1]</varname> conterrebbe + il valore + <filename>xwp.out</filename>. Analogamente, + <varname>$userfile_size[0]</varname> conterrebbe la dimensione di + <filename>review.html</filename>, e così via. + </simpara> + <simpara> + Anche + <varname>$userfile['name'][0]</varname>, + <varname>$userfile['tmp_name'][0]</varname>, + <varname>$userfile['size'][0]</varname>, e + <varname>$userfile['type'][0]</varname> sono impostati. + </simpara> + </sect1> + + <sect1 id="features.file-upload.put-method"> + <title>Supporto per metodo PUT</title> + + <para> + PHP fornisce supporto per il metodo HTTP PUT utilizzato da programmi + come Netscape Composer e W3C Amaya. Le richieste PUT sono molto più semplici + rispetto al caricamento di un file, e assomigliano a + <informalexample> + <programlisting> +PUT /percorso/nomefile.html HTTP/1.1 + </programlisting> + </informalexample> + </para> + <para> + Questo significa che normalmente il programma remoto intende salvare + il contenuto della richesta come : /percorso/nomefile.html nel filesystem sul +server web. + Non è ovviamente una buona idea per Apache o PHP lasciare a un qualsiasi utente +la + possibilità di sovrascrivere file sul server web. Quindi, per gestire questa + richiesta si deve chiedere al server web che si vuole che sia un certo script PHP +a + gestire la richiesta stessa. In Apache si ottiene questo con la direttiva + <emphasis>Script</emphasis>. Può essere posta quasi ovunque nel file di + configurazione di Apache. Un posto frequente è all'interno di un blocco + <Directory> oppurte all'interno del blocco + <Virtualhost>. Un linea come la seguente è sufficiente: + <informalexample> + <programlisting> +Script PUT /put.php + </programlisting> + </informalexample> + </para> + <simpara> + Questo chiede ad Apache di inviare tutte le richieste PUT che soddisfano + il contesto in cui si è inserito questo comando allo script put.php. Questo + richiede, naturalmente, che sia abilitato PHP per l'estensione .php e che + PHP sia attivo. + </simpara> + <simpara> + All'interno del file put.php si può inserire qualcosa del tipo: + </simpara> + <para> + <informalexample><programlisting role="php"> +<![CDATA[ +<?php copy($PHP_UPLOADED_FILE_NAME,$DOCUMENT_ROOT.$REQUEST_URI); ?> +]]> + </programlisting></informalexample> + </para> + <simpara> + Questo copia il file nella posizione chiesta dal programma + remoto. E' probabile che si vogliano effettuare dei controlli o + autenticazioni dell'utente prima di effettuare questa copia. L'unica magia + qui presente è che quando PHP vede una richiesta con metodo PUT memorizza il file +caricato in + un file temporaneo così come per i file caricati con il <link + linkend="features.file-upload.post-method">metodo POST</link>. + Quando la richiesta termina, questo file temporaneo è eliminato. Quindi il +gestore della + richiesta PUT deve copiare il file da qualche parte. Il nome del file temporaneo +è + memorizzato nella variabile $PHP_PUT_FILENAME, + ed è possibile vedere il nome del file di destinazione nella variabile + $REQUEST_URI (potrebbe variare su web server diversi da Apache). Qusto nome di +file di + destinazione è quello specificato dal client remoto. + Non è necessario seguire le indicazioni del client. E' possibile, per esempio, + copiare tutti i file caricati in una apposita directory. + </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 +sgml-parent-document:nil +sgml-default-dtd-file:"../../manual.ced" +sgml-exposed-tags:nil +sgml-local-catalogs:nil +sgml-local-ecat-files:nil +End: +vim600: syn=xml fen fdm=syntax fdl=2 si +vim: et tw=78 syn=sgml +vi: ts=1 sw=1 +-->