cvs: phpdoc-el /features file-upload.xml
| From: | Dimitris Glezos | Date: | Tue, 27 May 2003 00:49:06 +0000 |
| Subject: | cvs: phpdoc-el /features file-upload.xml | ||
| Groups: | php.doc.el | ||
| Request: | Send a blank email to doc-el+get-9@lists.php.net to get a copy of this message | ||
subbie Mon May 26 20:49:06 2003 EDT
Added files:
/phpdoc-el/features file-upload.xml
Log:
added file-upload.xml
Index: phpdoc-el/features/file-upload.xml +++ phpdoc-el/features/file-upload.xml <?xml version="1.0" encoding="iso-8859-7"?> <!-- $Revision: 1.1 $ --> <!-- EN-Revision: 1.59 Maintainer: subbie Status: ready --> <chapter id="features.file-upload"> <title>×åéñßæïíôáò upload áñ÷åßùí</title> <sect1 id="features.file-upload.post-method"> <title>Upload ìå ôçí POST ìÝèïäï</title> <simpara> Ç PHP åßíáé éêáíÞ ãéá íá ëáìâÜíåé upload áñ÷åßùí áðü ïðïéïäÞðïôå RFC-1867 óõìâáôü browser (áõôü óõìðåñéëáìâÜíåé ôïõò Netscape Navigator 3 Þ ìåãáëýôåñï, Microsoft Internet Explorer 3 ìå Ýíá patch áðü ôç Microsoft, Þ ìåãáëýôåñï ÷ùñßò êÜðïéï patch). Áõôü ôï ÷áñáêôçñéóôéêü åðéôñÝðåé óôïõò áíèñþðïõò íá êÜíïõí upload ôüóï êåéìÝíïõ, üóï êáé binary áñ÷åßá. Ìå ôéò óõíáñôÞóåéò áíáãíþñéóçò êáé ÷åéñéóìïý áñ÷åßùí ôçò PHP, Ý÷åôå ðëÞñç Ýëåã÷ï óôï ðïéüò åðéôñÝðåôáé íá êÜíåé upload êáé ôé èá ãßíåé ìå ôï áñ÷åßï áðü ôç óôéãìÞ ðïõ Ý÷åé ãßíåé upload êáé ìåôÜ. </simpara> <note> <title>Ó÷åôéêÝò Óçìåéþóåéò Ñõèìßóåùí</title> <para> Äåßôå åðßóçò ôá <link linkend="ini.file-uploads">file_uploads</link>, <link linkend="ini.upload-max-filesize">upload_max_filesize</link>, <link linkend="ini.upload-tmp-dir">upload_tmp_dir</link>, êáé <link linkend="ini.post-max-size">post_max_size</link> directives óôï &php.ini; </para> </note> <para> Óçìåéþóôå ðùò ç PHP åðßóçò õðïóôçñßæåé upload áñ÷åßùí ìå ôçí PUT ìÝèïäï üðùò ÷ñçóéìïðïéïýíôáé áõôÜ áðü ôïõò Netscape Composer êáé W3C's Amaya clients. Äåßôå ôï êåöÜëáéï <link linkend="features.file-upload.put-method">ÕðïóôÞñéîç ôçò PUT Ìåèüäïõ</link> ãéá ðåñéóóüôåñåò ðëçñïöïñßåò. </para> <para> Ìéá ïèüíç ãéá upload áñ÷åßïõ ìðïñåß íá öôéá÷ôåß äçìéïõñãþíôáò ìéá åéäéêÞ öüñìá ç ïðïßá ìïéÜæåé êÜðùò Ýôóé: <example> <title>Öüñìá ãéá Upload Áñ÷åßïõ</title> <programlisting role="html"> <![CDATA[ <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> ]]> </programlisting> </example> Ôï _URL_ ðñÝðåé íá äåß÷íåé óå êÜðïéï PHP áñ÷åßï. Ôï MAX_FILE_SIZE êñõöü ðåäßï (hidden) ðñÝðåé íá ðñïçãåßôáé ôïõ input ðåäßïõ ãéá ôï áñ÷åßï êáé ç ôéìÞ ôïõ åßíáé ôï ìÝãéóôï ìÝãåèïò áñ÷åßïõ ðïõ åðéôñÝðåôáé. Ç ôéìÞ åßíáé óå byte. <warning> <para> Ôï MAX_FILE_SIZE åßíáé åíçìåñùôéêü ãéá ôïí browser. Åßíáé åýêïëï íá ðáñáêáìöèåß áõôÞ ç ìÝãéóôç ôéìÞ. ¸ôóé ìçí óôçñßæåóôå üôé ï browser õðáêïýåé ôçí åðéèõìßá óáò! Ïé PHP-ñõèìßóåéò üìùò, ãéá ôï ìÝãéóôï ìÝãåèïò (maximum-size), äåí ìðïñïýí íá îåãåëáóôïýí. Êáëýôåñá íá ðñïóèÝôåôå ôï MAX_FILE_SIZE ïýôùò Þ Üëëùò ãéáôß ðñïóôáôåýåé ôïõò ÷ñÞóôåò áðü ôïí êüðï íá ðåñéìÝíïõí ãéá Ýíá ìåãÜëï áñ÷åßï íá ìåôáöåñèåß ìüíï êáé ìüíï ãéá íá ìÜèïõí ðùò Þôáí ðïëý ìåãÜëï ìåôÜ. </para> </warning> </para> <para> Ïé ìåôáâëçôÝò ðïõ ïñßæïíôáé ãéá áñ÷åßá ðïõ Ý÷ïõí ãßíåé upload áëëÜæïõí áíÜëïãá ìå ôçí Ýêäïóç ôçò PHP êáé ôéò ñõèìßóåéò. Ç autoglobal ìåôáâëçôÞ <link linkend="reserved.variables.files">$_FILES</link> õðÜñ÷åé áðü ôçí PHP 4.1.0. Ôï <varname>$HTTP_POST_FILES</varname> array õðÜñ÷åé áðü ôçí PHP 4.0.0. Áõôïß ïé ðßíáêåò èá ðåñéÝ÷ïõí üëåò ôéò ðëçñïöïñßåò ôùí áñ÷åßùí ðïõ Ý÷ïõí ãßíåé upload. Ç ÷ñÞóç ôçò <varname>$_FILES</varname> ðñïôéìÜôáé. Áí ôï PHP directive <link linkend="ini.register-globals">register_globals</link> åßíáé <emphasis>åíåñãïðïéçìÝíï</emphasis>, ôá ó÷åôéêÜ ïíüìáôá ôùí ìåôáâëçôþí èá õðÜñ÷ïõí åðßóçò. Ôï <link linkend="ini.register-globals">register_globals</link> Ý÷åé ùò ðñïåðéëïãÞ íá åßíáé <emphasis>áðåíåñãïðïéçìÝíï</emphasis> áðü ôçí PHP <ulink url="&url.php.release4.2.0;">4.2.0</ulink>. </para> <para> Ôá ðåñéå÷üìåíá ôçò <link linkend="reserved.variables.files">$_FILES</link> áðü ôï ðáñÜäåéãìá ìáò åßíáé ùò áêïëïýèùò. Óçìåéþóôå ðùò áõôü õðïèÝôåé ôç ÷ñÞóç ôïõ ïíüìáôïò áñ÷åßïõ íá åßíáé <emphasis>userfile</emphasis>, üðùò ÷ñçóéìïðïéåßôáé óôï ðáñÜäåéãìá ðáñáðÜíù. <variablelist> <varlistentry> <term><varname>$_FILES['userfile']['name']</varname></term> <listitem> <para> Ôï áñ÷éêü üíïìá ôïõ áñ÷åßïõ óôï ìç÷Üíçìá ôïõ client. </para> </listitem> </varlistentry> <varlistentry> <term><varname>$_FILES['userfile']['type']</varname></term> <listitem> <para> Ôï mime type ôïõ áñ÷åßïõ, áí ï browser Ý÷åé äþóåé áõôÞ ôç ðëçñïöïñßá. ¸íá ðáñÜäåéãìá èá Þôáí <literal>"image/gif"</literal>. </para> </listitem> </varlistentry> <varlistentry> <term><varname>$_FILES['userfile']['size']</varname></term> <listitem> <para> Ôï ìÝãåèïò, óå byte, ôïõ áñ÷åßïõ ðïõ Ý÷åé ãßíåé upload. </para> </listitem> </varlistentry> <varlistentry> <term><varname>$_FILES['userfile']['tmp_name']</varname></term> <listitem> <para> Ôï ðñïóùñéíü üíïìá ôïõ áñ÷åßïõ óôï ïðïßï Ý÷åé áðïèçêåõôåß ôï áñ÷åßï ðïõ Ý÷åé ãßíåé upload óôïí server. </para> </listitem> </varlistentry> <varlistentry> <term><varname>$_FILES['userfile']['error']</varname></term> <listitem> <para> Ï <link linkend="features.file-upload.errors">êùäéêüò óöÜëìáôïò</link> ðïõ ó÷åôßæåôáé ìå áõôü ôï upload áñ÷åßïõ. Ôï <emphasis>['error']</emphasis> Ý÷åé ðñïóôåèåß óôçí PHP 4.2.0 </para> </listitem> </varlistentry> </variablelist> </para> <note> <para> Óôéò åêäüóåéò ôçò PHP ðñéí ôçí 4.1.0 áõôü Ý÷åé üíïìá <varname>$HTTP_POST_FILES</varname> êáé äåí åßíáé ìéá <link linkend="language.variables.superglobals">autoglobal</link> ìåôáâëçôÞ üðùò åßíáé ç <varname>$_FILES</varname>. Ç PHP 3 äåí Ý÷åé õðïóôÞñéîç ãéá ôçí <varname>$HTTP_POST_FILES</varname>. </para> </note> <para> ¼ôáí ôï <link linkend="ini.register-globals">register_globals</link> åßíáé <emphasis>åíåñãïðïéçìÝíï</emphasis> óôï &php.ini;, åðéðëÝïí ìåôáâëçôÝò åßíáé äéáèÝóéìåò. Ãéá ðáñÜäåéãìá, ç <varname>$userfile_name</varname> èá éóïýôáé ìå ôçí <varname>$_FILES['userfile']['name']</varname>, ç <varname>$userfile_type</varname> èá éóïýôáé ìå ôçí <varname>$_FILES['userfile']['type']</varname>, êëð. ¸÷åôå õð' üøéí óáò ðùò áðü ôçí PHP 4.2.0, ôï register_globals åßíáé ðñïåðéëåãìÝíá áðåíåñãïðïéçìÝíï. ÐñïôéìÜôáé íá ìçí óôçñßæåóôå óå áõôü ôï directive. </para> <para> Ôá áñ÷åßá ðñïåðéëåãìÝíá èá áðïèçêåýïíôáé óôïí ðñïóùñéíü êáôÜëïãï ôïõ server, åêôüò êáé áí êÜðïéá Üëëç ôïðïèåóßá äïèåß ìå ôï <link linkend="ini.upload-tmp-dir">upload_tmp_dir</link> directive óôï &php.ini;. Ï ðñïåðéëåãìÝíïò êáôÜëïãïò ìðïñåß íá áëëá÷èåß ïñßæïíôáò ôçí ìåôáâëçôÞ ðåñéâÜëëïíôïò <envar>TMPDIR</envar> óôï ðåñéâÜëëïí óôï ïðïßï åêôåëåßôáé ç PHP. Ïñßæïíôáò ôï ìå ôçí <function>putenv</function> ìÝóá áðü Ýíá PHP script äåí èá äïõëÝøåé. ÁõôÞ ç ìåôáâëçôÞ ðåñéâÜëëïíôïò ìðïñåß åðéðëÝïí íá ÷ñçóéìïðïéçèåß ãéá íá óéãïõñåõôåßôå ðùò êáé Üëëåò åíÝñãåéåò åðéôåëïýíôáé óôá áñ÷åßá ðïõ Ý÷ïõí ãßíåé upload, åðéðëåüí. <example> <title>Åðéêýñùóç upload áñ÷åßùí</title> <para> Äåßôå åðßóçò ôéò êáôá÷ùñÞóåéò óõíáñôÞóåùí ãéá ôéò <function>is_uploaded_file</function> êáé <function>move_uploaded_file</function> ãéá ðåñéóóüôåñåò ðëçñïöïñßåò. Ôï ðáñáêÜôù ðáñÜäåéãìá èá åðåîåñãáóôåß Ýíá upload áñ÷åßïõ ðïõ ðñïÝñ÷åôáé áðü ìéá öüñìá. </para> <programlisting role="php"> <![CDATA[ <?php // In PHP earlier then 4.1.0, $HTTP_POST_FILES should be used instead of $_FILES. // In PHP earlier then 4.0.3, use copy() and is_uploaded_file() instead of move_uploaded_file $uploaddir = '/var/www/uploads/'; print "<pre>"; if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir . $_FILES['userfile']['name'])) { print "File is valid, and was successfully uploaded. Here's some more debugging info:\n"; print_r($_FILES); } else { print "Possible file upload attack! Here's some debugging info:\n"; print_r($_FILES); } ?> ]]> </programlisting> </example> </para> <simpara> Ôï PHP script ôï ïðïßï ëáìâÜíåé ôï áñ÷åßï ðñÝðåé íá åêôåëÝóåé ïðïéáäÞðïôå ëïãéêÞ åßíáé áðáñáßôçôç ãéá íá áðïöáóßóåé ôé èá ãßíåé ìå ôá áñ÷åßá. Ìðïñåßôå ãéá ðáñÜäåéãìá íá ÷ñçóéìïðïéÞóåôå ôçí÷ñçóéìïðïé <varname>$_FILES['userfile']['size']</varname> ìåôáâëçôÞ ãéá íá ðåôÜîåôå ïðïéáäÞðïôå áñ÷åßá åßíáé åßôå ðïëý ìéêñÜ åßôå ðïëý ìåãÜëá. Ìðïñåßôå íá ÷ñçóéìïðïéÞóåôå ôçí <varname>$_FILES['userfile']['type']</varname> ìåôáâëçôÞ ãéá íá ðåôÜîåôå ïðïéáäÞðïôå áñ÷åßá äåí ôáéñéÜæïõí óå ïñéóìÝíá êñéôÞñéá ôïõ ôýðïõ ôïõ áñ÷åßïõ. Áðü ôçí PHP 4.2.0, ìðïñåßôå íá ÷ñçóéìïðïéåßôå ôçí <varname>$_FILES['userfile']['error']</varname> êáé íá ðñïãñáììáôßæåôå ôç ëïãéêÞ óáò óýìöùíá ìå ôïõò <link linkend="features.file-upload.errors">êùäéêïýò óöáëìÜôùí</link>. ÏðïéáäÞðïôå ç ëïãéêÞ, èá ðñÝðåé åßôå íá äéáãñÜøåôå ôï áñ÷åßï áðü ôïí ðñïóùñéíü êáôÜëïãï Þ íá ôï ìåôáêéíÞóåôå êÜðïõ áëëïý. </simpara> <simpara> Ôï áñ÷åßï èá äéáãñáöåß áðü ôïí ðñïóùñéíü êáôÜëïãï óôï ôÝëïò ôïõ request áí äåí Ý÷åé ìåôáêéíçèåß Þ äéáãñáöåß. </simpara> </sect1> <sect1 id="features.file-upload.errors"> <title>ÅðåîÞãçóç ÌçíõìÜôùí ÓöáëìÜôùí</title> <simpara> Áðü ôçí PHP 4.2.0, ç PHP åðéóôñÝöåé Ýíá áíÜëïãï êùäéêü óöÜëìáôïò ìáæß ìå ôï array ôïõ áñ÷åßïõ. Ï êùäéêüò óöÜëìáôïò ìðïñåß íá âñåèåß óôï <emphasis>['error']</emphasis> ôìÞìá ôïõ array ôïõ áñ÷åßïõ ðïõ äçìéïõñãåßôáé êáôÜ ôï upload ôïõ áñ÷åßïõ áðü ôçí PHP. Ìå Üëëá ëüãéá, ôï óöÜëìá ìðïñåß íá âñåèåß óôï <varname>$_FILES['userfile']['error']</varname>. </simpara> <para> <variablelist> <varlistentry> <term><varname>UPLOAD_ERR_OK</varname></term> <listitem> <para> ÔéìÞ: 0; Äåí õðÜñ÷åé óöÜëìá, ôï áñ÷åßï Ý÷åé ãßíåé upload ìå åðéôõ÷ßá. </para> </listitem> </varlistentry> <varlistentry> <term><varname>UPLOAD_ERR_INI_SIZE</varname></term> <listitem> <para> ÔéìÞ: 1; Ôï áñ÷åßï ðïõ Ý÷åé ãßíåé upload õðåñâáßíåé ôï <link linkend="ini.upload-max-filesize">upload_max_filesize</link> directive óôï &php.ini;. </para> </listitem> </varlistentry> <varlistentry> <term><varname>UPLOAD_ERR_FORM_SIZE</varname></term> <listitem> <para> ÔéìÞ: 2; Ôï áñ÷åßï ðïõ Ý÷åé ãßíåé upload õðåñâáßíåé ôï <emphasis>MAX_FILE_SIZE</emphasis> directive ðïõ Ý÷åé ïñéóôåß óôçí html öüñìá. </para> </listitem> </varlistentry> <varlistentry> <term><varname>UPLOAD_ERR_PARTIAL</varname></term> <listitem> <para> ÔéìÞ: 3; Ôï áñ÷åßï ðïõ ãéíüôáí upload äåí ïëïêëÞñùóå ôçí áðïóôïëÞ ôïõ. </para> </listitem> </varlistentry> <varlistentry> <term><varname>UPLOAD_ERR_NO_FILE</varname></term> <listitem> <para> ÔéìÞ: 4; Äåí Ý÷åé ãßíåé êáíÝíá áñ÷åßï upload. </para> </listitem> </varlistentry> </variablelist> </para> <note> <para> ÁõôÝò ïé ìåôáâëçôÝò Ýãéíáí óôáèåñÝò ôçò PHP óôçí PHP 4.3.0. </para> </note> </sect1> <sect1 id="features.file-upload.common-pitfalls"> <title>Óõ÷íÝò Ðáãßäåò</title> <simpara> Ôï <literal>MAX_FILE_SIZE</literal> äåí ìðïñåß íá ïñßóåé ìÝãåèïò áñ÷åßïõ ìåãáëýôåñï áðü ôï ìÝãåèïò áñ÷åßïõ ðïõ Ý÷åé ïñéóôåß óôçí <link linkend="ini.upload-max-filesize">upload_max_filesize</link> ini-ñýèìéóç. Ôï ðñïåðéëåãìÝíï åßíáé 2 Megabyte. </simpara> <simpara> Áí ôï üñéï ìíÞìçò åßíáé ïñéóìÝíï, ìåãáëýôåñï <link linkend="ini.memory-limit">memory_limit</link> ìðïñåß íá ÷ñåéáóôåß. Óéãïõñåõôåßôå ðùò Ý÷åôå ïñßóåé ôï <link linkend="ini.memory-limit">memory_limit</link> áñêåôÜ ìåãÜëï. </simpara> <simpara> Áí ôï <link linkend="ini.max-execution-time">max_execution_time</link> ïñéóôåß íá åßáíé ðïëý ìéêñü, ç åêôÝëåóç ôïõ script ìðïñåß íá õðåñâåß ôçí ôéìÞ. Óéãïõñåõôåßôå ðùò Ý÷åôå ïñßóåé ôï <literal>max_execution_time</literal> áñêåôÜ ìåãÜëï. </simpara> <note> <simpara> Ôï <link linkend="ini.max-execution-time">max_execution_time</link> åðçñåÜæåé ìüíï ôïí ÷ñüíï åêôÝëåóçò ôïõ ßäéïõ ôïõ script. ÏðïéïóäÞðïôå ÷ñüíïò îïäåýåôáé óå åíÝñãåéåò ðïõ óõìâáßíïõí Ýîù áðü ôçí åêôÝëåóç ôïõ script üðùò êëÞóåéò óõóôÞìáôïò ÷ñçóéìïðïéþíôáò ôéò <function>system</function>, <function>sleep</function> óõíáñôÞóåéò, åñùôÞóåéò âÜóåùí äåäïìÝíùí, ÷ñüíï ðïõ îïäåýåôáé áðü ôçí äéáäéêáóßá ôïõ upload ôïõ áñ÷åßïõ, êëð. äåí óõìðåñéëáìâÜíåôáé üôáí ïñßæåôáé ï ìÝãéóôïò ÷ñüíïò ðïõ åêôåëåßôáé ôï script. </simpara> </note> <simpara> Áí ôï <link linkend="ini.post-max-size">post_max_size</link> ïñéóôåßõ ðïëý ìéêñü, ìåãÜëá áñ÷åßá äåí ìðïñïýí íá ãßíïõí upload. Óéãïõñåõôåßôå ðùò Ý÷åôå ïñßóåé ôï <literal>post_max_size</literal> áñêåôÜ ìåãÜëï. </simpara> <simpara> Áí äåí åðéêõñþíåôå óå ðïéÜ áñ÷åßá åðåíåñãåßôå, õðÜñ÷åé ðéèáíüôçôá êÜðïéïò ÷ñÞóôçò íá ìðïñÝóåé íá ðñïóðåëÜóåé åõáßóèçôåò ðëçñïöïñßåò óå Üëëïõò êáôáëüãïõò. </simpara> <simpara> Óçìåéþóôå ðùò ï httpd ôïõ CERN äåß÷íåé íá áöáéñåß ïôéäÞðïôå áñ÷ßæåé óôï ðñþôï whitespace óôï content-type mime header ðïõ ëáìâÜíåé áðü ôïí client. ¼óï èá Ý÷ïõí Ýôóé ôá ðñÜãìáôá, ôï CERN httpd äåí èá õðïóôçñßæåé upload áñ÷åßùí. </simpara> <simpara> Ëüãù ôïõ ìåãÜëïõ ìåãÝèïõò ôùí listing styles óôïõò êáôáëüãïõò, äåí åããõïýìáóôå ðùò áñ÷åßá ìå åîùôéêÜ ïíüìáôá (üðùò ôï íá ðåñéÝ÷ïõí êåíÜ) èá ÷åéñßæïíôáé óùóôÜ. </simpara> </sect1> <sect1 id="features.file-upload.multiple"> <title>Upload ðïëëáðëþí áñ÷åßùí</title> <simpara> ÐïëëáðëÜ áñ÷åßá ìðïñïýí íá ãßíïõí upload ÷ñçóéìïðïéþíôáò äéáöïñåôéêÜ <literal>name</literal> ãéá <literal>input</literal> (ïíüìáôá ãéá åßóïäï). </simpara> <simpara> Åßíáé åðßóçò äõíáôüí íá êÜíåôå upload ðïëëÜ áñ÷åßá ôáõôü÷ñïíá êáé íá Ý÷åôå ôçí ðëçñïöïñßá ïñãáíùìÝíç áõôüìáôá óå arrays ãéá óáò. Ãéá íá ôï êÜíåôå áõôü, ðñÝðåé íá ÷ñçóéìïðïéÞóåôå ôçí ßäéá óýíôáîç õðïâïëÞò ôïõ array óôçí HTML öüñìá óáò, üðùò êÜíåôå ìå ðïëëáðëÜ select êáé checkbox: </simpara> <note> <para> ÕðïóôÞñéîç ãéá ðïëëáðëÜ upload áñ÷åßùí ðñïóôÝèçêå óôçí 3.0.10. </para> </note> <para> <example> <title>ÊÜíïíôáò Upload ðïëëáðëÜ áñ÷åßá</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> ¼ôáí ç ðáñáðÜíù öüñìá õðïâëçèåß, ôá array <varname>$_FILES['userfile']</varname>, <varname>$_FILES['userfile']['name']</varname>, êáé <varname>$_FILES['userfile']['size']</varname> èá áñ÷éêïðïéçèïýí (üðùò åðßóçò óôï $HTTP_POST_FILES ãéá PHP åêäüóåéò ðñéí ôçí 4.1.0). ¼ôáí ôï <literal>register_globals</literal> åßíáé åíåñãïðïéçìÝíï, ôá globals ãéá áñ÷åßá ðïõ Ý÷ïõí ãßíåé upload èá áñ÷éêïðïéçèïýí åðßóçò. ÊáèÝíá áðü áõôÜ èá åßáíé Ýíá áñéèìçìÝíá indexed array ôùí áíÜëïãùí ôéìþí ãéá ôá áñ÷åßá ðïõ Ý÷ïõí õðïâëçèåß. </simpara> <simpara> Ãéá ðáñÜäåéãìá, õðïèÝóôå ðùò ôá áñ÷åßá ìå ïíüìáôá <filename>/home/test/review.html</filename> êáé <filename>/home/test/xwp.out</filename> õðïâÜëëïíôáé. Óå áõôÞ ôçí ðåñßðôùóç, ôï <varname>$_FILES['userfile']['name'][0]</varname> èá ðåñéÝ÷åé ôçí ôéìÞ <filename>review.html</filename>, êáé ôï <varname>$_FILES['userfile']['name'][1]</varname> èá ðåñéÝ÷åé ôçí ôéìÞ <filename>xwp.out</filename>. Ðáñüìïéá, ôï <varname>$_FILES['userfile']['size'][0]</varname> èá ðåñéÝ÷åé ôï ìÝãåèïò ôïõ <filename>review.html</filename>, ê.ï.ê. </simpara> <simpara> Ôá <varname>$_FILES['userfile']['name'][0]</varname>, <varname>$_FILES['userfile']['tmp_name'][0]</varname>, <varname>$_FILES['userfile']['size'][0]</varname>, êáé <varname>$_FILES['userfile']['type'][0]</varname> åðßóçò ïñßæïíôáé. </simpara> </sect1> <sect1 id="features.file-upload.put-method"> <title>ÕðïóôÞñéîç ôçò PUT ìåèüäïõ</title> <simpara> Ç õðïóôÞñéîç ãéá ôçí PUT ìÝèïäï Ý÷åé áëëÜîåé ìåôáîý ôçò PHP 3 êáé ôçò PHP 4. Óôçí PHP 4, ðñÝðåé íá ÷ñçóéìïðïéåßôå ôï standard input stream ãéá íá äéáâÜóåôå ôá ðåñéå÷üìåíá åíüò HTTP PUT. </simpara> <para> <example> <title>Áðïèçêåýïíôáò HTTP PUT áñ÷åßá ìå ôçí PHP 4</title> <programlisting role="php"> <![CDATA[ <?php /* PUT data comes in on the stdin stream */ $putdata = fopen("php://stdin","r"); /* Open a file for writting */ $fp = fopen("myputfile.ext","w"); /* Read the data 1kb at a time and write to the file */ while ($data = fread($putdata,1024)) fwrite($fp,$data); /* Close the streams */ fclose($fp); fclose($putdata); ?> ]]> </programlisting> </example> </para> <note> <para> ¼ëç ç ôåêìçñßùóç ðïõ áêïëïõèåß éó÷ýåé ãéá ôçí PHP 3 ìüíï. </para> </note> <para> Ç PHP ðñïóöÝñåé õðïóôÞñéîç ãéá ôçí HTTP PUT ìÝèïäï ðïõ ÷ñçóéìïðïéåßôáé áðü client óáí ôïõò Netscape Composer êáé W3C Amaya. Ïé PUT request åßíáé áñêåôÜ áðëïýóôåñåò áðü Ýíá upload áñ÷åßïõ êáé ìïéÜæïõí êÜðùò Ýôóé: <informalexample> <programlisting> PUT /path/filename.html HTTP/1.1 </programlisting> </informalexample> </para> <para> Áõôü êáíïíéêÜ óçìáßíåé ðùò ï remote client èá Þèåëå íá áðïèçêåýóåé ôá ðåñéå÷üìåíá ðïõ áêïëïõèïýí: /path/filename.html óôï web tree óáò. Ðñïöáíþò äåí åßíáé êáé ôüóï êáëÞ éäÝá ï Apache Þ ç PHP íá áöÞíïõí áõôüìáôá ïðïéïíäÞðïôå íá êÜíåé overwrite áñ÷åßá óôï web tree óáò. ¸ôóé, ãéá íá ÷åéñéóôåßôå Ýíá ôÝôïéï request ðñÝðåé ðñþôá íá ðåßôå óôïí web server óáò ðùò èÝëåôå Ýíá óõãêåêñéìÝíï PHP script íá ÷åéñéóôåß ôï request. Óôïí Apache ôï êÜíåôå áõôü ìå ôï <emphasis>Script</emphasis> directive. Ìðïñåß íá ôïðïèåôçèåß ó÷åäüí ïðïõäÞðïôå ìÝóá óôï áñ÷åßï ñõèìßóåùí ôïõ Apache. ¸íá óõíçèéóìÝíï ìÝñïò åßíáé ìÝóá óå Ýíá <Directory> ìðëïê Þ ðéèáíþò ìÝóá óå Ýíá <Virtualhost> ìðëïê. Ìéá ãñáììÞ óáí êáé áõôÞ èá êÜíåé ôï êüëðï: <informalexample> <programlisting> Script PUT /put.php </programlisting> </informalexample> </para> <simpara> Áõôü ëÝåé óôïí Apache íá óôÝëíåé üëá ôá PUT request ãéá URI ðïõ ôáéñéÜæïõí óôï ðåñéå÷üìåíï óôï ïðïßï ôïðïèåôÞóáôå áõôÞ ôç ãñáììÞ óôï put.php script óáò. Áõôü õðïèÝôåé, öõóéêÜ, ðùò Ý÷åôå ôçí PHP óõíäåäåìÝíç ãéá ôçí .php åðÝêôáóç êáé ðùò ç PHP åßíáé åíåñãïðïéçìÝíç. </simpara> <simpara> ÌÝóá óôï put.php áñ÷åßï óáò èá èÝëåôå íá êÜíåôå êÜôé ôÝôïéï: </simpara> <para> <informalexample><programlisting role="php"> <![CDATA[ <?php copy($PHP_UPLOADED_FILE_NAME,$DOCUMENT_ROOT.$REQUEST_URI); ?> ]]> </programlisting></informalexample> </para> <simpara> Áõôü èá áíôéãñÜøåé ôï áñ÷åßï óôçí ôïðïèåóßá ðïõ æçôÞèçêå áðü ôïí remote client. Èá èÝëåôå ðéèáíþò íá êÜíåôå êÜðïéïõò Ýëåã÷ïõò Þ/êáé íá áíáãíùñßóåôå ôùí ÷ñÞóôç ðñéí íá åêôåëÝóåé áõôÞ ôçí áíôéãñáöÞ ôïõ áñ÷åßïõ. Ôï ìüíï êüëðï åäþ åßíáé ðùò üôáí ç PHP äåé Ýíá request ìÝóù PUT ìåèüäïõ áðïèçêåýåé ôï áñ÷åßï ðïõ Ý÷åé ãßíåé upload óå Ýíá ðñïóùñéíü áñ÷åßï üðùò åêßíá ðïõ ÷åéñßæåôáé ç <link linkend="features.file-upload.post-method">POST-ìÝèïäïò</link>. ¼ôáí ôï request ôåëåéþóåé, áõôü ôï ðñïóùñéíü áñ÷åßï äéáãñÜöåôáé. ¸ôóé, ôï PHP script óáò ðïõ ÷åéñßæåôáé ôï PUT ðñÝðåé íá áíôéãÜøåé ôï áñ÷åßï áõôü êÜðïõ áëëïý. Ôï üíïìá ôïõ ðñïóùñéíïý áõôïý áñ÷åßïõ åßíáé ìÝóá óôçí $PHP_PUT_FILENAME ìåôáâëçôÞ, êáé ìðïñåßôå íá äåßôå ôï ðñïôåéíüìåíï üíïìá ðñïïñéóìïý óôï $REQUEST_URI (ìðïñåß íá äéáöÝñåé óå web server åêôüò ôïõ Apache). Áõôü ôï üíïìá áñ÷åßïõ ðñïïñéóìïý åßíáé áõôü ðïõ ï remote client ïñßæåé. Äåí ÷ñåéÜæåôáé íá áêïýóåôå ôïí client. Èá ìðïñïýóáôå, ãéá ðáñÜäåéãìá, íá áíôéãñÜöåôå üëá ôá áñ÷åßá ðïõ ãßíïíôáé upload óå Ýíá åéäéêü êáôÜëïãï ãéá ôá upload. </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: vim600: syn=xml fen fdm=syntax fdl=2 si vim: et tw=78 syn=sgml vi: ts=1 sw=1 -->
Index: phpdoc-el/features/file-upload.xml +++ phpdoc-el/features/file-upload.xml <?xml version="1.0" encoding="iso-8859-7"?> <!-- $Revision: 1.1 $ --> <!-- EN-Revision: 1.59 Maintainer: subbie Status: ready --> <chapter id="features.file-upload"> <title>×åéñßæïíôáò upload áñ÷åßùí</title> <sect1 id="features.file-upload.post-method"> <title>Upload ìå ôçí POST ìÝèïäï</title> <simpara> Ç PHP åßíáé éêáíÞ ãéá íá ëáìâÜíåé upload áñ÷åßùí áðü ïðïéïäÞðïôå RFC-1867 óõìâáôü browser (áõôü óõìðåñéëáìâÜíåé ôïõò Netscape Navigator 3 Þ ìåãáëýôåñï, Microsoft Internet Explorer 3 ìå Ýíá patch áðü ôç Microsoft, Þ ìåãáëýôåñï ÷ùñßò êÜðïéï patch). Áõôü ôï ÷áñáêôçñéóôéêü åðéôñÝðåé óôïõò áíèñþðïõò íá êÜíïõí upload ôüóï êåéìÝíïõ, üóï êáé binary áñ÷åßá. Ìå ôéò óõíáñôÞóåéò áíáãíþñéóçò êáé ÷åéñéóìïý áñ÷åßùí ôçò PHP, Ý÷åôå ðëÞñç Ýëåã÷ï óôï ðïéüò åðéôñÝðåôáé íá êÜíåé upload êáé ôé èá ãßíåé ìå ôï áñ÷åßï áðü ôç óôéãìÞ ðïõ Ý÷åé ãßíåé upload êáé ìåôÜ. </simpara> <note> <title>Ó÷åôéêÝò Óçìåéþóåéò Ñõèìßóåùí</title> <para> Äåßôå åðßóçò ôá <link linkend="ini.file-uploads">file_uploads</link>, <link linkend="ini.upload-max-filesize">upload_max_filesize</link>, <link linkend="ini.upload-tmp-dir">upload_tmp_dir</link>, êáé <link linkend="ini.post-max-size">post_max_size</link> directives óôï &php.ini; </para> </note> <para> Óçìåéþóôå ðùò ç PHP åðßóçò õðïóôçñßæåé upload áñ÷åßùí ìå ôçí PUT ìÝèïäï üðùò ÷ñçóéìïðïéïýíôáé áõôÜ áðü ôïõò Netscape Composer êáé W3C's Amaya clients. Äåßôå ôï êåöÜëáéï <link linkend="features.file-upload.put-method">ÕðïóôÞñéîç ôçò PUT Ìåèüäïõ</link> ãéá ðåñéóóüôåñåò ðëçñïöïñßåò. </para> <para> Ìéá ïèüíç ãéá upload áñ÷åßïõ ìðïñåß íá öôéá÷ôåß äçìéïõñãþíôáò ìéá åéäéêÞ öüñìá ç ïðïßá ìïéÜæåé êÜðùò Ýôóé: <example> <title>Öüñìá ãéá Upload Áñ÷åßïõ</title> <programlisting role="html"> <![CDATA[ <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> ]]> </programlisting> </example> Ôï _URL_ ðñÝðåé íá äåß÷íåé óå êÜðïéï PHP áñ÷åßï. Ôï MAX_FILE_SIZE êñõöü ðåäßï (hidden) ðñÝðåé íá ðñïçãåßôáé ôïõ input ðåäßïõ ãéá ôï áñ÷åßï êáé ç ôéìÞ ôïõ åßíáé ôï ìÝãéóôï ìÝãåèïò áñ÷åßïõ ðïõ åðéôñÝðåôáé. Ç ôéìÞ åßíáé óå byte. <warning> <para> Ôï MAX_FILE_SIZE åßíáé åíçìåñùôéêü ãéá ôïí browser. Åßíáé åýêïëï íá ðáñáêáìöèåß áõôÞ ç ìÝãéóôç ôéìÞ. ¸ôóé ìçí óôçñßæåóôå üôé ï browser õðáêïýåé ôçí åðéèõìßá óáò! Ïé PHP-ñõèìßóåéò üìùò, ãéá ôï ìÝãéóôï ìÝãåèïò (maximum-size), äåí ìðïñïýí íá îåãåëáóôïýí. Êáëýôåñá íá ðñïóèÝôåôå ôï MAX_FILE_SIZE ïýôùò Þ Üëëùò ãéáôß ðñïóôáôåýåé ôïõò ÷ñÞóôåò áðü ôïí êüðï íá ðåñéìÝíïõí ãéá Ýíá ìåãÜëï áñ÷åßï íá ìåôáöåñèåß ìüíï êáé ìüíï ãéá íá ìÜèïõí ðùò Þôáí ðïëý ìåãÜëï ìåôÜ. </para> </warning> </para> <para> Ïé ìåôáâëçôÝò ðïõ ïñßæïíôáé ãéá áñ÷åßá ðïõ Ý÷ïõí ãßíåé upload áëëÜæïõí áíÜëïãá ìå ôçí Ýêäïóç ôçò PHP êáé ôéò ñõèìßóåéò. Ç autoglobal ìåôáâëçôÞ <link linkend="reserved.variables.files">$_FILES</link> õðÜñ÷åé áðü ôçí PHP 4.1.0. Ôï <varname>$HTTP_POST_FILES</varname> array õðÜñ÷åé áðü ôçí PHP 4.0.0. Áõôïß ïé ðßíáêåò èá ðåñéÝ÷ïõí üëåò ôéò ðëçñïöïñßåò ôùí áñ÷åßùí ðïõ Ý÷ïõí ãßíåé upload. Ç ÷ñÞóç ôçò <varname>$_FILES</varname> ðñïôéìÜôáé. Áí ôï PHP directive <link linkend="ini.register-globals">register_globals</link> åßíáé <emphasis>åíåñãïðïéçìÝíï</emphasis>, ôá ó÷åôéêÜ ïíüìáôá ôùí ìåôáâëçôþí èá õðÜñ÷ïõí åðßóçò. Ôï <link linkend="ini.register-globals">register_globals</link> Ý÷åé ùò ðñïåðéëïãÞ íá åßíáé <emphasis>áðåíåñãïðïéçìÝíï</emphasis> áðü ôçí PHP <ulink url="&url.php.release4.2.0;">4.2.0</ulink>. </para> <para> Ôá ðåñéå÷üìåíá ôçò <link linkend="reserved.variables.files">$_FILES</link> áðü ôï ðáñÜäåéãìá ìáò åßíáé ùò áêïëïýèùò. Óçìåéþóôå ðùò áõôü õðïèÝôåé ôç ÷ñÞóç ôïõ ïíüìáôïò áñ÷åßïõ íá åßíáé <emphasis>userfile</emphasis>, üðùò ÷ñçóéìïðïéåßôáé óôï ðáñÜäåéãìá ðáñáðÜíù. <variablelist> <varlistentry> <term><varname>$_FILES['userfile']['name']</varname></term> <listitem> <para> Ôï áñ÷éêü üíïìá ôïõ áñ÷åßïõ óôï ìç÷Üíçìá ôïõ client. </para> </listitem> </varlistentry> <varlistentry> <term><varname>$_FILES['userfile']['type']</varname></term> <listitem> <para> Ôï mime type ôïõ áñ÷åßïõ, áí ï browser Ý÷åé äþóåé áõôÞ ôç ðëçñïöïñßá. ¸íá ðáñÜäåéãìá èá Þôáí <literal>"image/gif"</literal>. </para> </listitem> </varlistentry> <varlistentry> <term><varname>$_FILES['userfile']['size']</varname></term> <listitem> <para> Ôï ìÝãåèïò, óå byte, ôïõ áñ÷åßïõ ðïõ Ý÷åé ãßíåé upload. </para> </listitem> </varlistentry> <varlistentry> <term><varname>$_FILES['userfile']['tmp_name']</varname></term> <listitem> <para> Ôï ðñïóùñéíü üíïìá ôïõ áñ÷åßïõ óôï ïðïßï Ý÷åé áðïèçêåõôåß ôï áñ÷åßï ðïõ Ý÷åé ãßíåé upload óôïí server. </para> </listitem> </varlistentry> <varlistentry> <term><varname>$_FILES['userfile']['error']</varname></term> <listitem> <para> Ï <link linkend="features.file-upload.errors">êùäéêüò óöÜëìáôïò</link> ðïõ ó÷åôßæåôáé ìå áõôü ôï upload áñ÷åßïõ. Ôï <emphasis>['error']</emphasis> Ý÷åé ðñïóôåèåß óôçí PHP 4.2.0 </para> </listitem> </varlistentry> </variablelist> </para> <note> <para> Óôéò åêäüóåéò ôçò PHP ðñéí ôçí 4.1.0 áõôü Ý÷åé üíïìá <varname>$HTTP_POST_FILES</varname> êáé äåí åßíáé ìéá <link linkend="language.variables.superglobals">autoglobal</link> ìåôáâëçôÞ üðùò åßíáé ç <varname>$_FILES</varname>. Ç PHP 3 äåí Ý÷åé õðïóôÞñéîç ãéá ôçí <varname>$HTTP_POST_FILES</varname>. </para> </note> <para> ¼ôáí ôï <link linkend="ini.register-globals">register_globals</link> åßíáé <emphasis>åíåñãïðïéçìÝíï</emphasis> óôï &php.ini;, åðéðëÝïí ìåôáâëçôÝò åßíáé äéáèÝóéìåò. Ãéá ðáñÜäåéãìá, ç <varname>$userfile_name</varname> èá éóïýôáé ìå ôçí <varname>$_FILES['userfile']['name']</varname>, ç <varname>$userfile_type</varname> èá éóïýôáé ìå ôçí <varname>$_FILES['userfile']['type']</varname>, êëð. ¸÷åôå õð' üøéí óáò ðùò áðü ôçí PHP 4.2.0, ôï register_globals åßíáé ðñïåðéëåãìÝíá áðåíåñãïðïéçìÝíï. ÐñïôéìÜôáé íá ìçí óôçñßæåóôå óå áõôü ôï directive. </para> <para> Ôá áñ÷åßá ðñïåðéëåãìÝíá èá áðïèçêåýïíôáé óôïí ðñïóùñéíü êáôÜëïãï ôïõ server, åêôüò êáé áí êÜðïéá Üëëç ôïðïèåóßá äïèåß ìå ôï <link linkend="ini.upload-tmp-dir">upload_tmp_dir</link> directive óôï &php.ini;. Ï ðñïåðéëåãìÝíïò êáôÜëïãïò ìðïñåß íá áëëá÷èåß ïñßæïíôáò ôçí ìåôáâëçôÞ ðåñéâÜëëïíôïò <envar>TMPDIR</envar> óôï ðåñéâÜëëïí óôï ïðïßï åêôåëåßôáé ç PHP. Ïñßæïíôáò ôï ìå ôçí <function>putenv</function> ìÝóá áðü Ýíá PHP script äåí èá äïõëÝøåé. ÁõôÞ ç ìåôáâëçôÞ ðåñéâÜëëïíôïò ìðïñåß åðéðëÝïí íá ÷ñçóéìïðïéçèåß ãéá íá óéãïõñåõôåßôå ðùò êáé Üëëåò åíÝñãåéåò åðéôåëïýíôáé óôá áñ÷åßá ðïõ Ý÷ïõí ãßíåé upload, åðéðëåüí. <example> <title>Åðéêýñùóç upload áñ÷åßùí</title> <para> Äåßôå åðßóçò ôéò êáôá÷ùñÞóåéò óõíáñôÞóåùí ãéá ôéò <function>is_uploaded_file</function> êáé <function>move_uploaded_file</function> ãéá ðåñéóóüôåñåò ðëçñïöïñßåò. Ôï ðáñáêÜôù ðáñÜäåéãìá èá åðåîåñãáóôåß Ýíá upload áñ÷åßïõ ðïõ ðñïÝñ÷åôáé áðü ìéá öüñìá. </para> <programlisting role="php"> <![CDATA[ <?php // In PHP earlier then 4.1.0, $HTTP_POST_FILES should be used instead of $_FILES. // In PHP earlier then 4.0.3, use copy() and is_uploaded_file() instead of move_uploaded_file $uploaddir = '/var/www/uploads/'; print "<pre>"; if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir . $_FILES['userfile']['name'])) { print "File is valid, and was successfully uploaded. Here's some more debugging info:\n"; print_r($_FILES); } else { print "Possible file upload attack! Here's some debugging info:\n"; print_r($_FILES); } ?> ]]> </programlisting> </example> </para> <simpara> Ôï PHP script ôï ïðïßï ëáìâÜíåé ôï áñ÷åßï ðñÝðåé íá åêôåëÝóåé ïðïéáäÞðïôå ëïãéêÞ åßíáé áðáñáßôçôç ãéá íá áðïöáóßóåé ôé èá ãßíåé ìå ôá áñ÷åßá. Ìðïñåßôå ãéá ðáñÜäåéãìá íá ÷ñçóéìïðïéÞóåôå ôçí÷ñçóéìïðïé <varname>$_FILES['userfile']['size']</varname> ìåôáâëçôÞ ãéá íá ðåôÜîåôå ïðïéáäÞðïôå áñ÷åßá åßíáé åßôå ðïëý ìéêñÜ åßôå ðïëý ìåãÜëá. Ìðïñåßôå íá ÷ñçóéìïðïéÞóåôå ôçí <varname>$_FILES['userfile']['type']</varname> ìåôáâëçôÞ ãéá íá ðåôÜîåôå ïðïéáäÞðïôå áñ÷åßá äåí ôáéñéÜæïõí óå ïñéóìÝíá êñéôÞñéá ôïõ ôýðïõ ôïõ áñ÷åßïõ. Áðü ôçí PHP 4.2.0, ìðïñåßôå íá ÷ñçóéìïðïéåßôå ôçí <varname>$_FILES['userfile']['error']</varname> êáé íá ðñïãñáììáôßæåôå ôç ëïãéêÞ óáò óýìöùíá ìå ôïõò <link linkend="features.file-upload.errors">êùäéêïýò óöáëìÜôùí</link>. ÏðïéáäÞðïôå ç ëïãéêÞ, èá ðñÝðåé åßôå íá äéáãñÜøåôå ôï áñ÷åßï áðü ôïí ðñïóùñéíü êáôÜëïãï Þ íá ôï ìåôáêéíÞóåôå êÜðïõ áëëïý. </simpara> <simpara> Ôï áñ÷åßï èá äéáãñáöåß áðü ôïí ðñïóùñéíü êáôÜëïãï óôï ôÝëïò ôïõ request áí äåí Ý÷åé ìåôáêéíçèåß Þ äéáãñáöåß. </simpara> </sect1> <sect1 id="features.file-upload.errors"> <title>ÅðåîÞãçóç ÌçíõìÜôùí ÓöáëìÜôùí</title> <simpara> Áðü ôçí PHP 4.2.0, ç PHP åðéóôñÝöåé Ýíá áíÜëïãï êùäéêü óöÜëìáôïò ìáæß ìå ôï array ôïõ áñ÷åßïõ. Ï êùäéêüò óöÜëìáôïò ìðïñåß íá âñåèåß óôï <emphasis>['error']</emphasis> ôìÞìá ôïõ array ôïõ áñ÷åßïõ ðïõ äçìéïõñãåßôáé êáôÜ ôï upload ôïõ áñ÷åßïõ áðü ôçí PHP. Ìå Üëëá ëüãéá, ôï óöÜëìá ìðïñåß íá âñåèåß óôï <varname>$_FILES['userfile']['error']</varname>. </simpara> <para> <variablelist> <varlistentry> <term><varname>UPLOAD_ERR_OK</varname></term> <listitem> <para> ÔéìÞ: 0; Äåí õðÜñ÷åé óöÜëìá, ôï áñ÷åßï Ý÷åé ãßíåé upload ìå åðéôõ÷ßá. </para> </listitem> </varlistentry> <varlistentry> <term><varname>UPLOAD_ERR_INI_SIZE</varname></term> <listitem> <para> ÔéìÞ: 1; Ôï áñ÷åßï ðïõ Ý÷åé ãßíåé upload õðåñâáßíåé ôï <link linkend="ini.upload-max-filesize">upload_max_filesize</link> directive óôï &php.ini;. </para> </listitem> </varlistentry> <varlistentry> <term><varname>UPLOAD_ERR_FORM_SIZE</varname></term> <listitem> <para> ÔéìÞ: 2; Ôï áñ÷åßï ðïõ Ý÷åé ãßíåé upload õðåñâáßíåé ôï <emphasis>MAX_FILE_SIZE</emphasis> directive ðïõ Ý÷åé ïñéóôåß óôçí html öüñìá. </para> </listitem> </varlistentry> <varlistentry> <term><varname>UPLOAD_ERR_PARTIAL</varname></term> <listitem> <para> ÔéìÞ: 3; Ôï áñ÷åßï ðïõ ãéíüôáí upload äåí ïëïêëÞñùóå ôçí áðïóôïëÞ ôïõ. </para> </listitem> </varlistentry> <varlistentry> <term><varname>UPLOAD_ERR_NO_FILE</varname></term> <listitem> <para> ÔéìÞ: 4; Äåí Ý÷åé ãßíåé êáíÝíá áñ÷åßï upload. </para> </listitem> </varlistentry> </variablelist> </para> <note> <para> ÁõôÝò ïé ìåôáâëçôÝò Ýãéíáí óôáèåñÝò ôçò PHP óôçí PHP 4.3.0. </para> </note> </sect1> <sect1 id="features.file-upload.common-pitfalls"> <title>Óõ÷íÝò Ðáãßäåò</title> <simpara> Ôï <literal>MAX_FILE_SIZE</literal> äåí ìðïñåß íá ïñßóåé ìÝãåèïò áñ÷åßïõ ìåãáëýôåñï áðü ôï ìÝãåèïò áñ÷åßïõ ðïõ Ý÷åé ïñéóôåß óôçí <link linkend="ini.upload-max-filesize">upload_max_filesize</link> ini-ñýèìéóç. Ôï ðñïåðéëåãìÝíï åßíáé 2 Megabyte. </simpara> <simpara> Áí ôï üñéï ìíÞìçò åßíáé ïñéóìÝíï, ìåãáëýôåñï <link linkend="ini.memory-limit">memory_limit</link> ìðïñåß íá ÷ñåéáóôåß. Óéãïõñåõôåßôå ðùò Ý÷åôå ïñßóåé ôï <link linkend="ini.memory-limit">memory_limit</link> áñêåôÜ ìåãÜëï. </simpara> <simpara> Áí ôï <link linkend="ini.max-execution-time">max_execution_time</link> ïñéóôåß íá åßáíé ðïëý ìéêñü, ç åêôÝëåóç ôïõ script ìðïñåß íá õðåñâåß ôçí ôéìÞ. Óéãïõñåõôåßôå ðùò Ý÷åôå ïñßóåé ôï <literal>max_execution_time</literal> áñêåôÜ ìåãÜëï. </simpara> <note> <simpara> Ôï <link linkend="ini.max-execution-time">max_execution_time</link> åðçñåÜæåé ìüíï ôïí ÷ñüíï åêôÝëåóçò ôïõ ßäéïõ ôïõ script. ÏðïéïóäÞðïôå ÷ñüíïò îïäåýåôáé óå åíÝñãåéåò ðïõ óõìâáßíïõí Ýîù áðü ôçí åêôÝëåóç ôïõ script üðùò êëÞóåéò óõóôÞìáôïò ÷ñçóéìïðïéþíôáò ôéò <function>system</function>, <function>sleep</function> óõíáñôÞóåéò, åñùôÞóåéò âÜóåùí äåäïìÝíùí, ÷ñüíï ðïõ îïäåýåôáé áðü ôçí äéáäéêáóßá ôïõ upload ôïõ áñ÷åßïõ, êëð. äåí óõìðåñéëáìâÜíåôáé üôáí ïñßæåôáé ï ìÝãéóôïò ÷ñüíïò ðïõ åêôåëåßôáé ôï script. </simpara> </note> <simpara> Áí ôï <link linkend="ini.post-max-size">post_max_size</link> ïñéóôåßõ ðïëý ìéêñü, ìåãÜëá áñ÷åßá äåí ìðïñïýí íá ãßíïõí upload. Óéãïõñåõôåßôå ðùò Ý÷åôå ïñßóåé ôï <literal>post_max_size</literal> áñêåôÜ ìåãÜëï. </simpara> <simpara> Áí äåí åðéêõñþíåôå óå ðïéÜ áñ÷åßá åðåíåñãåßôå, õðÜñ÷åé ðéèáíüôçôá êÜðïéïò ÷ñÞóôçò íá ìðïñÝóåé íá ðñïóðåëÜóåé åõáßóèçôåò ðëçñïöïñßåò óå Üëëïõò êáôáëüãïõò. </simpara> <simpara> Óçìåéþóôå ðùò ï httpd ôïõ CERN äåß÷íåé íá áöáéñåß ïôéäÞðïôå áñ÷ßæåé óôï ðñþôï whitespace óôï content-type mime header ðïõ ëáìâÜíåé áðü ôïí client. ¼óï èá Ý÷ïõí Ýôóé ôá ðñÜãìáôá, ôï CERN httpd äåí èá õðïóôçñßæåé upload áñ÷åßùí. </simpara> <simpara> Ëüãù ôïõ ìåãÜëïõ ìåãÝèïõò ôùí listing styles óôïõò êáôáëüãïõò, äåí åããõïýìáóôå ðùò áñ÷åßá ìå åîùôéêÜ ïíüìáôá (üðùò ôï íá ðåñéÝ÷ïõí êåíÜ) èá ÷åéñßæïíôáé óùóôÜ. </simpara> </sect1> <sect1 id="features.file-upload.multiple"> <title>Upload ðïëëáðëþí áñ÷åßùí</title> <simpara> ÐïëëáðëÜ áñ÷åßá ìðïñïýí íá ãßíïõí upload ÷ñçóéìïðïéþíôáò äéáöïñåôéêÜ <literal>name</literal> ãéá <literal>input</literal> (ïíüìáôá ãéá åßóïäï). </simpara> <simpara> Åßíáé åðßóçò äõíáôüí íá êÜíåôå upload ðïëëÜ áñ÷åßá ôáõôü÷ñïíá êáé íá Ý÷åôå ôçí ðëçñïöïñßá ïñãáíùìÝíç áõôüìáôá óå arrays ãéá óáò. Ãéá íá ôï êÜíåôå áõôü, ðñÝðåé íá ÷ñçóéìïðïéÞóåôå ôçí ßäéá óýíôáîç õðïâïëÞò ôïõ array óôçí HTML öüñìá óáò, üðùò êÜíåôå ìå ðïëëáðëÜ select êáé checkbox: </simpara> <note> <para> ÕðïóôÞñéîç ãéá ðïëëáðëÜ upload áñ÷åßùí ðñïóôÝèçêå óôçí 3.0.10. </para> </note> <para> <example> <title>ÊÜíïíôáò Upload ðïëëáðëÜ áñ÷åßá</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> ¼ôáí ç ðáñáðÜíù öüñìá õðïâëçèåß, ôá array <varname>$_FILES['userfile']</varname>, <varname>$_FILES['userfile']['name']</varname>, êáé <varname>$_FILES['userfile']['size']</varname> èá áñ÷éêïðïéçèïýí (üðùò åðßóçò óôï $HTTP_POST_FILES ãéá PHP åêäüóåéò ðñéí ôçí 4.1.0). ¼ôáí ôï <literal>register_globals</literal> åßíáé åíåñãïðïéçìÝíï, ôá globals ãéá áñ÷åßá ðïõ Ý÷ïõí ãßíåé upload èá áñ÷éêïðïéçèïýí åðßóçò. ÊáèÝíá áðü áõôÜ èá åßáíé Ýíá áñéèìçìÝíá indexed array ôùí áíÜëïãùí ôéìþí ãéá ôá áñ÷åßá ðïõ Ý÷ïõí õðïâëçèåß. </simpara> <simpara> Ãéá ðáñÜäåéãìá, õðïèÝóôå ðùò ôá áñ÷åßá ìå ïíüìáôá <filename>/home/test/review.html</filename> êáé <filename>/home/test/xwp.out</filename> õðïâÜëëïíôáé. Óå áõôÞ ôçí ðåñßðôùóç, ôï <varname>$_FILES['userfile']['name'][0]</varname> èá ðåñéÝ÷åé ôçí ôéìÞ <filename>review.html</filename>, êáé ôï <varname>$_FILES['userfile']['name'][1]</varname> èá ðåñéÝ÷åé ôçí ôéìÞ <filename>xwp.out</filename>. Ðáñüìïéá, ôï <varname>$_FILES['userfile']['size'][0]</varname> èá ðåñéÝ÷åé ôï ìÝãåèïò ôïõ <filename>review.html</filename>, ê.ï.ê. </simpara> <simpara> Ôá <varname>$_FILES['userfile']['name'][0]</varname>, <varname>$_FILES['userfile']['tmp_name'][0]</varname>, <varname>$_FILES['userfile']['size'][0]</varname>, êáé <varname>$_FILES['userfile']['type'][0]</varname> åðßóçò ïñßæïíôáé. </simpara> </sect1> <sect1 id="features.file-upload.put-method"> <title>ÕðïóôÞñéîç ôçò PUT ìåèüäïõ</title> <simpara> Ç õðïóôÞñéîç ãéá ôçí PUT ìÝèïäï Ý÷åé áëëÜîåé ìåôáîý ôçò PHP 3 êáé ôçò PHP 4. Óôçí PHP 4, ðñÝðåé íá ÷ñçóéìïðïéåßôå ôï standard input stream ãéá íá äéáâÜóåôå ôá ðåñéå÷üìåíá åíüò HTTP PUT. </simpara> <para> <example> <title>Áðïèçêåýïíôáò HTTP PUT áñ÷åßá ìå ôçí PHP 4</title> <programlisting role="php"> <![CDATA[ <?php /* PUT data comes in on the stdin stream */ $putdata = fopen("php://stdin","r"); /* Open a file for writting */ $fp = fopen("myputfile.ext","w"); /* Read the data 1kb at a time and write to the file */ while ($data = fread($putdata,1024)) fwrite($fp,$data); /* Close the streams */ fclose($fp); fclose($putdata); ?> ]]> </programlisting> </example> </para> <note> <para> ¼ëç ç ôåêìçñßùóç ðïõ áêïëïõèåß éó÷ýåé ãéá ôçí PHP 3 ìüíï. </para> </note> <para> Ç PHP ðñïóöÝñåé õðïóôÞñéîç ãéá ôçí HTTP PUT ìÝèïäï ðïõ ÷ñçóéìïðïéåßôáé áðü client óáí ôïõò Netscape Composer êáé W3C Amaya. Ïé PUT request åßíáé áñêåôÜ áðëïýóôåñåò áðü Ýíá upload áñ÷åßïõ êáé ìïéÜæïõí êÜðùò Ýôóé: <informalexample> <programlisting> PUT /path/filename.html HTTP/1.1 </programlisting> </informalexample> </para> <para> Áõôü êáíïíéêÜ óçìáßíåé ðùò ï remote client èá Þèåëå íá áðïèçêåýóåé ôá ðåñéå÷üìåíá ðïõ áêïëïõèïýí: /path/filename.html óôï web tree óáò. Ðñïöáíþò äåí åßíáé êáé ôüóï êáëÞ éäÝá ï Apache Þ ç PHP íá áöÞíïõí áõôüìáôá ïðïéïíäÞðïôå íá êÜíåé overwrite áñ÷åßá óôï web tree óáò. ¸ôóé, ãéá íá ÷åéñéóôåßôå Ýíá ôÝôïéï request ðñÝðåé ðñþôá íá ðåßôå óôïí web server óáò ðùò èÝëåôå Ýíá óõãêåêñéìÝíï PHP script íá ÷åéñéóôåß ôï request. Óôïí Apache ôï êÜíåôå áõôü ìå ôï <emphasis>Script</emphasis> directive. Ìðïñåß íá ôïðïèåôçèåß ó÷åäüí ïðïõäÞðïôå ìÝóá óôï áñ÷åßï ñõèìßóåùí ôïõ Apache. ¸íá óõíçèéóìÝíï ìÝñïò åßíáé ìÝóá óå Ýíá <Directory> ìðëïê Þ ðéèáíþò ìÝóá óå Ýíá <Virtualhost> ìðëïê. Ìéá ãñáììÞ óáí êáé áõôÞ èá êÜíåé ôï êüëðï: <informalexample> <programlisting> Script PUT /put.php </programlisting> </informalexample> </para> <simpara> Áõôü ëÝåé óôïí Apache íá óôÝëíåé üëá ôá PUT request ãéá URI ðïõ ôáéñéÜæïõí óôï ðåñéå÷üìåíï óôï ïðïßï ôïðïèåôÞóáôå áõôÞ ôç ãñáììÞ óôï put.php script óáò. Áõôü õðïèÝôåé, öõóéêÜ, ðùò Ý÷åôå ôçí PHP óõíäåäåìÝíç ãéá ôçí .php åðÝêôáóç êáé ðùò ç PHP åßíáé åíåñãïðïéçìÝíç. </simpara> <simpara> ÌÝóá óôï put.php áñ÷åßï óáò èá èÝëåôå íá êÜíåôå êÜôé ôÝôïéï: </simpara> <para> <informalexample><programlisting role="php"> <![CDATA[ <?php copy($PHP_UPLOADED_FILE_NAME,$DOCUMENT_ROOT.$REQUEST_URI); ?> ]]> </programlisting></informalexample> </para> <simpara> Áõôü èá áíôéãñÜøåé ôï áñ÷åßï óôçí ôïðïèåóßá ðïõ æçôÞèçêå áðü ôïí remote client. Èá èÝëåôå ðéèáíþò íá êÜíåôå êÜðïéïõò Ýëåã÷ïõò Þ/êáé íá áíáãíùñßóåôå ôùí ÷ñÞóôç ðñéí íá åêôåëÝóåé áõôÞ ôçí áíôéãñáöÞ ôïõ áñ÷åßïõ. Ôï ìüíï êüëðï åäþ åßíáé ðùò üôáí ç PHP äåé Ýíá request ìÝóù PUT ìåèüäïõ áðïèçêåýåé ôï áñ÷åßï ðïõ Ý÷åé ãßíåé upload óå Ýíá ðñïóùñéíü áñ÷åßï üðùò åêßíá ðïõ ÷åéñßæåôáé ç <link linkend="features.file-upload.post-method">POST-ìÝèïäïò</link>. ¼ôáí ôï request ôåëåéþóåé, áõôü ôï ðñïóùñéíü áñ÷åßï äéáãñÜöåôáé. ¸ôóé, ôï PHP script óáò ðïõ ÷åéñßæåôáé ôï PUT ðñÝðåé íá áíôéãÜøåé ôï áñ÷åßï áõôü êÜðïõ áëëïý. Ôï üíïìá ôïõ ðñïóùñéíïý áõôïý áñ÷åßïõ åßíáé ìÝóá óôçí $PHP_PUT_FILENAME ìåôáâëçôÞ, êáé ìðïñåßôå íá äåßôå ôï ðñïôåéíüìåíï üíïìá ðñïïñéóìïý óôï $REQUEST_URI (ìðïñåß íá äéáöÝñåé óå web server åêôüò ôïõ Apache). Áõôü ôï üíïìá áñ÷åßïõ ðñïïñéóìïý åßíáé áõôü ðïõ ï remote client ïñßæåé. Äåí ÷ñåéÜæåôáé íá áêïýóåôå ôïí client. Èá ìðïñïýóáôå, ãéá ðáñÜäåéãìá, íá áíôéãñÜöåôå üëá ôá áñ÷åßá ðïõ ãßíïíôáé upload óå Ýíá åéäéêü êáôÜëïãï ãéá ôá upload. </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: vim600: syn=xml fen fdm=syntax fdl=2 si vim: et tw=78 syn=sgml vi: ts=1 sw=1 -->