tpug Thu Dec 13 17:27:45 2001 EDT Added files: /phpdoc/tr/features file-upload.xml Log: complete translation by Mesut
Index: phpdoc/tr/features/file-upload.xml +++ phpdoc/tr/features/file-upload.xml <?xml version="1.0" encoding="iso-8859-1"?> <!-- $Revision: 1.1 $ --> <chapter id="features.file-upload"> <title>Dosya yükleme yönetimi</title> <sect1 id="features.file-upload.post-method"> <title>POST metodu ile dosya yükleme</title> <simpara> PHP, RFC-1867 uyumlu tüm tarayıcılardan (Netscape Navigator 3 ve daha üst sürümler, Mücrosoft'un yayınladığı bir yama ile Microsoft Internet Explorer 3, veya diğer üst sürümleri) dosya yüklemek için yeteneklidir. Bu özellik kullanıcıların binary veya metinsel dosya yükleyebilmelerini sağlamaktadır. PHP'nin yetkilendirme ve dosya işleme özellikleri ile, dosyaları kimin yükleybileceği ve yüklendikten sonra ne yapılacağı konusunda tam kontrol sahibisinizdir. </simpara> <para> PHP, Netscape Composer ve W3C'nin Amaya üyeleri tarafından kullanılan PUT yöntemi ile de dosya yükleme işlemini destekler. PUT Yöntemi hakkında detaylı bilgi için<link linkend="features.file-upload.put-method">tıklayınız.</link> </para> <para> Dosya yükleme ekranı, aşağıdaki gibi özel bir form hazırlamakla oluşturulur: <example> <title>Dosya Yükleme Formu</title> <programlisting role="html"> <![CDATA[ <form enctype="multipart/form-data" action="_URL_" method="post"> <input type="hidden" name="MAX_FILE_SIZE" value="1000"> Bu dosyayı gönder: <input name="userfile" type="file"> <input type="submit" value="Gönder"> </form> ]]> </programlisting> </example> _URL_ bir PHP dosyasını işaret etmelidir. MAX_FILE_SIZE gizli alanı, form içinde dosya alanından üstte olmalıdır ve taşığıdı değer, kabul edilebilir enfazla dosya boyunu gösterir. Değer byte cinsindendir. <warning> <para> MAX_FILE_SIZE sadece tarayıcıya, bu boyutu aşmamasını söyler. Bunu aşmak çok kolaydır. Bu yüzden buna pek fazla güvenmeyin. PHP'nin ayarlarındaki maximum-size ise aşılamaz. </para> </warning> </para> <para> PHP'de , <filename>php.ini</filename> içindeki <link linkend="ini.register-globals">register_globals</link>'ın on olduğu varsayılırsa, başarılı bir dosya yükleme anında aşağıdaki değişkenler tanımlanır. Eğer <link linkend="ini.track-vars">track_vars</link> on ise, bu değişkenler PHP'nin <varname>$HTTP_POST_VARS</varname> dizinleri olarak da alınabilir. Aşağıdaki değişken adları, yukarıdaki örnekteki 'userfile' alan adının kullanıldığı varsayılarak verilmiştir: <itemizedlist> <listitem> <simpara> <varname>$userfile</varname> - Dosyanın, sunucuda saklanan geçici adı. </simpara> </listitem> <listitem> <simpara> <varname>$userfile_name</varname> - Dosyayı gönderen kişinin bilgisayarındaki dosyanın orijinal adı veya sistem yolu. </simpara> </listitem> <listitem> <simpara> <varname>$userfile_size</varname> - Gönderilen dosyanın byte cinsinden boyutu. </simpara> </listitem> <listitem> <simpara> <varname>$userfile_type</varname> - Tarayıcının bu bilgiyi vermesine bağlı olarak, dosyanın mime tipi. Örneğin "image/gif". </simpara> </listitem> </itemizedlist> Yukarıdaki değişkenlerin "$userfile" bölümü, yükleme formundaki INPUT TYPE=file alanına verdiğiniz isimdir. Yukarıdaki yükleme formunda biz "userfile" ismini kullandık. </para> <para> PHP 4'de durum bir parça farklı. Yüklenen dosya bilgileri <varname>$HTTP_POST_FILES</varname> dizinlerine yüklenmiştir. Bu PHP 3'de olduğu gibi, eğer <link linkend="ini.track-vars">track_vars</link> on olarak tanımlanmış ise geçerlidir. Fakat PHP 4.0.2 ve üst sürümlerinde <link linkend="ini.track-vars">track_vars</link> on olarak tanımlı gelir. </para> <para> <varname>$HTTP_POST_FILES</varname>'ın içeriği aşağıdaki gibidir. Bu örnekte de, formdaki dosya yükleme alanının adının "userfile" olduğu varsayılmıştır: <variablelist> <varlistentry> <term><varname>$HTTP_POST_FILES['userfile']['name']</varname></term> <listitem> <para> Dosyanın, dosyayı gönderenin bilgisayarındaki orijinal adı. </para> </listitem> </varlistentry> <varlistentry> <term><varname>$HTTP_POST_FILES['userfile']['type']</varname></term> <listitem> <para> Tarayıcının bu bilgiyi vermesine bağlı olarak, dosyanın mime tipi. Örneğin <literal>"image/gif"</literal>. </para> </listitem> </varlistentry> <varlistentry> <term><varname>$HTTP_POST_FILES['userfile']['size']</varname></term> <listitem> <para> Gönderilen dosyanın byte cinsinden boyutu. </para> </listitem> </varlistentry> <varlistentry> <term><varname>$HTTP_POST_FILES['userfile']['tmp_name']</varname></term> <listitem> <para> Dosyanın, sunucuda saklanan geçici adı. </para> </listitem> </varlistentry> </variablelist> </para> <para> <filename>php.ini</filename> içindeki <link linkend="ini.upload-tmp-dir">upload_tmp_dir</link> tanımlamasına farklı bir yer tanımlanmadıkça, dosyalar, sunucuda tanımlı olan geçici klasör de saklanır. Sunucunun tanımlı geçici klasörü, <envar>TMPDIR</envar> değişkeni tanımlanarak değiştirilebilir. Bu tanımlamayı, PHP dosyası içinde <function>putenv</function> fonksiyonunu kullanarak tanımlamak geçerli olmayacaktır. Bu değişkeni, gönderilen dosya üzerindeki başka işlemlerin çalışırlığından emin olmak içinde kullanabilirsiniz. <example> <title>Dosya Yükleme Kontrolü</title> <para> Aşağıdaki örnek, PHP 3'ün, 3.0.16'den ve PHP 4'ün 4.0.2'den yüksek sürümleri içindir. Fonksiyon özellikleri için <function>is_uploaded_file</function> ve <function>move_uploaded_file</function> sayfalarına bakınız. </para> <programlisting role="php"> <![CDATA[ <?php if (is_uploaded_file($userfile)) { copy($userfile, "/place/to/put/uploaded/file"); } else { echo "Possible file upload attack: filename '$userfile'."; } /* ...or... */ move_uploaded_file($userfile, "/place/to/put/uploaded/file"); ?> ]]> </programlisting> <para> PHP'nin daha önceki sürümleri için, aşağıdaki gibi bir seye ihtiyacınız var. <note> <para> Bu örnek PHP'nin 4.0.2'den sonraki sürümlerinde <emphasis>çalışmaz</emphasis>. </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, "/place/to/put/uploaded/file"); } else { echo "Possible file upload attack: filename '$userfile'."; } ?> ]]> </programlisting> </example> </para> <simpara> Gönderilen dosyayı alan PHP dosyanız, gönderilen dosyanın ne yapılacağına karar vermek için programlanmalıdır. Örneğin, dosya boyutu çok büyük veya çok küçük olan dosyaları kabul etmemek için <varname>$file_size</varname> değişkenini kullanabilirsiniz. <varname>$file_type</varname> değişkenini, belirlediğiniz kriterlerdeki dosya tipine uymayan dosyaları kabul etmemek için kullanabilirsiniz. İstemediğiniz bu dosyaları, geçici klasörden silebilir veya farklı bir klasöre taşıyabilirsiniz. </simpara> <simpara> İşlem sonunda, dosya taşınmadı veya adı değiştirilmedi ise, geçici klasörden silinir. </simpara> </sect1> <sect1 id="features.file-upload.common-pitfalls"> <title>Genel Tehlikeler</title> <simpara> Formdaki <literal>MAX_FILE_SIZE</literal> alanı, PHP'nin ini tanımlarındaki <link linkend="ini.upload-max-filesize">upload_max_filesize</link> da tanımlanmış değerden daha büyük bir değer tanıyamaz. Tanımlı gelen 2 Megabyte tır. </simpara> <simpara> İşlem yaptığınız dosyayı kontrol etmemek, kullanıcıların diğer klasörlerdeki hassas bilgilerinize erişebilmesi demektir. </simpara> <simpara> Lütfen CERN httpd'nin istemciden gelen content-type mime başlığında ilk boşluktan sonraki her şeyi silme eğiliminde olduğunu not edin. Bu durum devam ettikçe, CERN httpd dosya yükleme özelliğini desteklemeyecektir. </simpara> </sect1> <sect1 id="features.file-upload.multiple"> <title>Çoklu Dosya Yükleme</title> <simpara> Aynı anda birden fazla dosya yüklemek ve dosya bilgilerini otomatik olarak organize olmuş bir dizin olarak almak mümkündür. Bunu yapmak için, HTML formlarda kullandığınız Checkbox alanlarında olduğu gibi, aynı dizin gönderimi yapmalısınız: </simpara> <note> <para> Çoklu dosya yükleme desteği 3.0.10 sürümünde eklenmiştir. </para> </note> <para> <example> <title>Çoklu Dosya Yükleme</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> Yukarıdaki form gönderildiğinde, dizinler <varname>$userfile</varname>, <varname>$userfile_name</varname>, ve <varname>$userfile_size</varname> will be formed in the global scope (as well as in $HTTP_POST_FILES ($HTTP_POST_VARS in PHP 3)). Bunların her biri, gönderilen dosyaların değerlerini içeren numaralandırılmış dizin olacaktır. </simpara> <simpara> Örneğin, gönderilen dosya adlarının şöyle olduğunu varsayalım: <filename>/home/test/review.html</filename> ve <filename>/home/test/xwp.out</filename>. Bu durumda, <varname>$userfile_name[0]</varname>, <filename>review.html</filename> değerini içerir, ve <varname>$userfile_name[1]</varname> de <filename>xwp.out</filename> değerini içerir. Bir benzeri de, <varname>$userfile_size[0]</varname>, <filename>review.html</filename>'in dosya boyutunu içerir. Diğerleri de aynıdır. </simpara> <simpara> <varname>$userfile['name'][0]</varname>, <varname>$userfile['tmp_name'][0]</varname>, <varname>$userfile['size'][0]</varname>, ve <varname>$userfile['type'][0]</varname> de tanımlanmıştır. </simpara> </sect1> <sect1 id="features.file-upload.put-method"> <title>PUT Yönetmi Desteği</title> <para> PHP Netscape Composer ve W3C Amaya gibi programların kullandığı HTTP PUT yöntemini de destekler. PUT işlemi, bir dosya yükleme işleminden daha basittir ve aşağıdaki gibidir: <informalexample> <programlisting> PUT /path/filename.html HTTP/1.1 </programlisting> </informalexample> </para> <para> Bu şu demektir: dosyayı yükleyen, dosyayı, web düzeniniz içindeki /path/filename.html içine kaydetmek istemektedir. Tüm kulanıcıların, web dizini içindeki herhangi bir dosyanın üzerine yazmak Apache ve PHP için kesinlikle iyi bir fikir değildir. Bu tür bir işlemi kontrol altına almak için, web sunucunuza böyle bir işlem için belirli bir PHP dosyasını kullanmasını söylemelisiniz. Apache'de bu işlem <emphasis>Script</emphasis> direktifi ile yapılmaktadır. Bu direktif, Apache'nin konfigursasyon dosyasında herhangi bir yere konulabilir. Genellikle <Directory> bloğunun veya <Virtualhost> bloğunun içine konur. Bunun gibi bir satır işinizi görecektir: <informalexample> <programlisting> Script PUT /put.php </programlisting> </informalexample> </para> <simpara> Bu satır, Apache'ye, tüm PUT istemlerini, eklediğimiz satırda bulunan put.php dosyasına göndermesini söyler. Bu örnek, .php uzantısının çalışır olduğu ve PHP nin aktif olduğu varsayılarak verilmiştir. </simpara> <simpara> put.php dosyanızda, şöyle birşey yapabilirsiniz: </simpara> <para> <informalexample><programlisting role="php"> <![CDATA[ <?php copy($PHP_UPLOADED_FILE_NAME,$DOCUMENT_ROOT.$REQUEST_URI); ?> ]]> </programlisting></informalexample> </para> <simpara> Bu işlem, dosyayı, işelemi yapan kişinin istediği klasöre kopyalar. Bu kopyalama işlemini gerçekleştirmeden önce, bazı kontroler ve/veya giriş kontrolleri yapmak isteyebilirsiniz. İstek sonlandığında, bu geçici dosya silinir. Dolayısı ile işlemi gerçekleştiren dosyanız, bu dosyayı başka bir yere kopyalamalıdır. Bu geçici klasördeki dosya adı $PHP_PUT_FILENAME değişkenindedir ve isteği gönderenin belirlediği dosya adını $REQUEST_URI (Apache dışındaki web sunucularda değişebilir) değişkeninde görebilirsiniz. Bu belirtilen dosya adı, dosyayı gönderenin belirlediği dosya adıdır. Bu isteği gerçekleştirmek zorunda değilsinizdir. Örneğin tüm dosyaları, belirlediğiniz bir klasöre kopyalabilirsiniz. </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 -->