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 (357 lines) | stat: -rw-r--r-- 16,106 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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
<?xml version="1.0" encoding="iso-8859-9"?>
<!-- $Revision: 1.2 $ -->
 <chapter id="features.file-upload">
  <title>Dosya ykleme ynetimi</title>

  <sect1 id="features.file-upload.post-method">
   <title>POST metodu ile dosya ykleme</title>

   <simpara>
    PHP, RFC-1867 uyumlu tm taray&inodot;c&inodot;lardan (Netscape Navigator 3 ve daha st srmler,
    Mcrosoft'un yay&inodot;nlad&inodot;&gbreve;&inodot; bir yama ile Microsoft Internet Explorer 3, veya di&gbreve;er st srmleri)
	dosya yklemek iin yeteneklidir. Bu zellik kullan&inodot;c&inodot;lar&inodot;n binary veya metinsel
	dosya ykleyebilmelerini sa&gbreve;lamaktad&inodot;r.  PHP'nin yetkilendirme ve dosya i&scedil;leme zellikleri ile,
	dosyalar&inodot; kimin ykleybilece&gbreve;i ve yklendikten sonra ne yap&inodot;laca&gbreve;&inodot; konusunda tam kontrol sahibisinizdir.
   </simpara>
   <para>
    PHP, Netscape Composer ve W3C'nin Amaya yeleri taraf&inodot;ndan kullan&inodot;lan PUT yntemi ile de 
	dosya ykleme i&scedil;lemini destekler. PUT Yntemi hakk&inodot;nda detayl&inodot; bilgi iin<link
    linkend="features.file-upload.put-method">t&inodot;klay&inodot;n&inodot;z.</link>
   </para>
   <para>
    Dosya ykleme ekran&inodot;, a&scedil;a&gbreve;&inodot;daki gibi zel bir form haz&inodot;rlamakla olu&scedil;turulur:
    <example>
     <title>Dosya Ykleme 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&inodot; gnder: <input name="userfile" type="file">
<input type="submit" value="Gnder">
</form>
]]>
     </programlisting>
    </example>
    _URL_ bir PHP dosyas&inodot;n&inodot; i&scedil;aret etmelidir.  MAX_FILE_SIZE gizli alan&inodot;, form iinde
    dosya alan&inodot;ndan stte olmal&inodot;d&inodot;r ve ta&scedil;&inodot;&gbreve;&inodot;d&inodot; de&gbreve;er, kabul edilebilir enfazla dosya boyunu 
	gsterir.  De&gbreve;er byte cinsindendir.
	<warning>
	 <para>
	  MAX_FILE_SIZE sadece taray&inodot;c&inodot;ya, bu boyutu a&scedil;mamas&inodot;n&inodot; syler. Bunu a&scedil;mak ok kolayd&inodot;r.
	  Bu yzden buna pek fazla gvenmeyin. PHP'nin ayarlar&inodot;ndaki maximum-size ise a&scedil;&inodot;lamaz.
	 </para>
	</warning>
   </para>

   <para>
    PHP'de , <filename>php.ini</filename> iindeki <link
    linkend="ini.register-globals">register_globals</link>'&inodot;n on oldu&gbreve;u varsay&inodot;l&inodot;rsa, 
	ba&scedil;ar&inodot;l&inodot; bir dosya ykleme an&inodot;nda a&scedil;a&gbreve;&inodot;daki de&gbreve;i&scedil;kenler tan&inodot;mlan&inodot;r.
	E&gbreve;er <link
    linkend="ini.track-vars">track_vars</link> on ise, bu de&gbreve;i&scedil;kenler PHP'nin 
    <varname>$HTTP_POST_VARS</varname> dizinleri olarak da al&inodot;nabilir.
	A&scedil;a&gbreve;&inodot;daki de&gbreve;i&scedil;ken adlar&inodot;, yukar&inodot;daki rnekteki 'userfile' alan ad&inodot;n&inodot;n kullan&inodot;ld&inodot;&gbreve;&inodot; varsay&inodot;larak
	verilmi&scedil;tir:

    <itemizedlist>
     <listitem>
      <simpara>
       <varname>$userfile</varname> - Dosyan&inodot;n, sunucuda saklanan geici ad&inodot;.
      </simpara>
     </listitem>
     <listitem>
      <simpara>
       <varname>$userfile_name</varname> - Dosyay&inodot; gnderen ki&scedil;inin bilgisayar&inodot;ndaki dosyan&inodot;n
	   orijinal ad&inodot; veya sistem yolu.
      </simpara>
     </listitem>
     <listitem>
      <simpara>
       <varname>$userfile_size</varname> - Gnderilen dosyan&inodot;n byte cinsinden boyutu.
      </simpara>
     </listitem>
     <listitem>
      <simpara>
       <varname>$userfile_type</varname> - Taray&inodot;c&inodot;n&inodot;n bu bilgiyi vermesine ba&gbreve;l&inodot; olarak, 
	   dosyan&inodot;n mime tipi. rne&gbreve;in "image/gif".
      </simpara>
     </listitem>
    </itemizedlist>
	Yukar&inodot;daki de&gbreve;i&scedil;kenlerin "$userfile" blm, ykleme formundaki INPUT TYPE=file 
	alan&inodot;na verdi&gbreve;iniz isimdir.	Yukar&inodot;daki ykleme formunda biz "userfile" ismini kulland&inodot;k.
   </para>

   <para>
   PHP 4'de durum bir para farkl&inodot;. Yklenen dosya bilgileri <varname>$HTTP_POST_FILES</varname>
   dizinlerine yklenmi&scedil;tir. Bu PHP 3'de oldu&gbreve;u gibi, e&gbreve;er <link linkend="ini.track-vars">track_vars</link> 
   on olarak tan&inodot;mlanm&inodot;&scedil; ise geerlidir. Fakat PHP 4.0.2 ve st srmlerinde 
   <link linkend="ini.track-vars">track_vars</link> on olarak tan&inodot;ml&inodot; gelir.
   </para>

   <para>
    <varname>$HTTP_POST_FILES</varname>'&inodot;n ieri&gbreve;i a&scedil;a&gbreve;&inodot;daki gibidir.
	Bu rnekte de, formdaki dosya ykleme alan&inodot;n&inodot;n ad&inodot;n&inodot;n "userfile" oldu&gbreve;u varsay&inodot;lm&inodot;&scedil;t&inodot;r:
    <variablelist>
     <varlistentry>
      <term><varname>$HTTP_POST_FILES['userfile']['name']</varname></term>
      <listitem>
       <para>
        Dosyan&inodot;n, dosyay&inodot; gnderenin bilgisayar&inodot;ndaki orijinal ad&inodot;.
       </para>
      </listitem>
     </varlistentry>
     <varlistentry>
      <term><varname>$HTTP_POST_FILES['userfile']['type']</varname></term>
      <listitem>
       <para>
        Taray&inodot;c&inodot;n&inodot;n bu bilgiyi vermesine ba&gbreve;l&inodot; olarak, 
	   dosyan&inodot;n mime tipi. rne&gbreve;in <literal>"image/gif"</literal>.
        </para>
      </listitem>
     </varlistentry>
     <varlistentry>
      <term><varname>$HTTP_POST_FILES['userfile']['size']</varname></term>
      <listitem>
       <para>
        Gnderilen dosyan&inodot;n byte cinsinden boyutu.
       </para>
      </listitem>
     </varlistentry>
     <varlistentry>
      <term><varname>$HTTP_POST_FILES['userfile']['tmp_name']</varname></term>
      <listitem>
       <para>
        Dosyan&inodot;n, sunucuda saklanan geici ad&inodot;.
       </para>
      </listitem>
     </varlistentry>
    </variablelist>
   </para>

   <para>
    <filename>php.ini</filename> iindeki <link
    linkend="ini.upload-tmp-dir">upload_tmp_dir</link> tan&inodot;mlamas&inodot;na farkl&inodot; bir yer 
	tan&inodot;mlanmad&inodot;ka, dosyalar, sunucuda tan&inodot;ml&inodot; olan geici klasr de saklan&inodot;r.
    Sunucunun tan&inodot;ml&inodot; geici klasr, <envar>TMPDIR</envar> de&gbreve;i&scedil;keni tan&inodot;mlanarak de&gbreve;i&scedil;tirilebilir.
    Bu tan&inodot;mlamay&inodot;, PHP dosyas&inodot; iinde <function>putenv</function> fonksiyonunu kullanarak
	tan&inodot;mlamak geerli olmayacakt&inodot;r.
	Bu de&gbreve;i&scedil;keni, gnderilen dosya zerindeki ba&scedil;ka i&scedil;lemlerin al&inodot;&scedil;&inodot;rl&inodot;&gbreve;&inodot;ndan
	emin olmak iinde kullanabilirsiniz.
    <example>
     <title>Dosya Ykleme Kontrol</title>
     <para>
	 A&scedil;a&gbreve;&inodot;daki rnek, PHP 3'n, 3.0.16'den ve PHP 4'n 4.0.2'den yksek srmleri iindir.
	 Fonksiyon zellikleri iin  <function>is_uploaded_file</function> ve
      <function>move_uploaded_file</function> sayfalar&inodot;na bak&inodot;n&inodot;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 srmleri iin, a&scedil;a&gbreve;&inodot;daki gibi bir seye ihtiyac&inodot;n&inodot;z var.
      <note>
       <para>
        Bu rnek PHP'nin 4.0.2'den sonraki srmlerinde <emphasis>al&inodot;&scedil;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>
    Gnderilen dosyay&inodot; alan PHP dosyan&inodot;z, gnderilen dosyan&inodot;n ne yap&inodot;laca&gbreve;&inodot;na
	karar vermek iin programlanmal&inodot;d&inodot;r.
	rne&gbreve;in, dosya boyutu ok byk veya ok kk olan
	dosyalar&inodot; kabul etmemek iin <varname>$file_size</varname> de&gbreve;i&scedil;kenini kullanabilirsiniz.
	<varname>$file_type</varname> de&gbreve;i&scedil;kenini, belirledi&gbreve;iniz kriterlerdeki dosya tipine uymayan
	dosyalar&inodot; kabul etmemek iin kullanabilirsiniz.
	&Idot;stemedi&gbreve;iniz bu dosyalar&inodot;, geici klasrden silebilir veya farkl&inodot; bir klasre ta&scedil;&inodot;yabilirsiniz.
   </simpara>
   <simpara>
   &Idot;&scedil;lem sonunda, dosya ta&scedil;&inodot;nmad&inodot; veya ad&inodot; de&gbreve;i&scedil;tirilmedi ise, geici 
   klasrden silinir.
   </simpara>
  </sect1>
 
  <sect1 id="features.file-upload.common-pitfalls">
   <title>Genel Tehlikeler</title>
   <simpara>
    Formdaki <literal>MAX_FILE_SIZE</literal> alan&inodot;, PHP'nin ini tan&inodot;mlar&inodot;ndaki 
	<link linkend="ini.upload-max-filesize">upload_max_filesize</link> da tan&inodot;mlanm&inodot;&scedil; de&gbreve;erden
	daha byk bir de&gbreve;er tan&inodot;yamaz. Tan&inodot;ml&inodot; gelen 2 Megabyte t&inodot;r.
   </simpara>
   <simpara>
   &Idot;&scedil;lem yapt&inodot;&gbreve;&inodot;n&inodot;z dosyay&inodot; kontrol etmemek, kullan&inodot;c&inodot;lar&inodot;n di&gbreve;er klasrlerdeki
   hassas bilgilerinize eri&scedil;ebilmesi demektir.
   </simpara>
   <simpara>
   Ltfen CERN httpd'nin istemciden gelen content-type mime ba&scedil;l&inodot;&gbreve;&inodot;nda ilk bo&scedil;luktan sonraki her &scedil;eyi silme e&gbreve;iliminde oldu&gbreve;unu
   not edin. Bu durum devam ettike, CERN httpd dosya ykleme zelli&gbreve;ini desteklemeyecektir.
   </simpara>
  </sect1>

  <sect1 id="features.file-upload.multiple">
   <title>oklu Dosya Ykleme</title>
   <simpara>
   Ayn&inodot; anda birden fazla dosya yklemek ve dosya bilgilerini otomatik olarak
   organize olmu&scedil; bir dizin olarak almak mmkndr. Bunu yapmak iin, HTML formlarda kulland&inodot;&gbreve;&inodot;n&inodot;z
   Checkbox alanlar&inodot;nda oldu&gbreve;u gibi, ayn&inodot; dizin gnderimi yapmal&inodot;s&inodot;n&inodot;z:
   </simpara>
   <note>
    <para>
	oklu dosya ykleme deste&gbreve;i 3.0.10 srmnde eklenmi&scedil;tir.
    </para>
   </note>
   <para>
    <example>
     <title>oklu Dosya Ykleme</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&inodot;daki form gnderildi&gbreve;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&inodot;n her biri, gnderilen dosyalar&inodot;n de&gbreve;erlerini ieren
	numaraland&inodot;r&inodot;lm&inodot;&scedil; dizin olacakt&inodot;r.
   </simpara>
   <simpara>
    rne&gbreve;in, gnderilen dosya adlar&inodot;n&inodot;n &scedil;yle oldu&gbreve;unu varsayal&inodot;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&gbreve;erini ierir,
    ve <varname>$userfile_name[1]</varname> de <filename>xwp.out</filename> de&gbreve;erini ierir.
	Bir benzeri de,
    <varname>$userfile_size[0]</varname>, <filename>review.html</filename>'in dosya boyutunu ierir. Di&gbreve;erleri de ayn&inodot;d&inodot;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&inodot;mlanm&inodot;&scedil;t&inodot;r.
   </simpara>
  </sect1>

  <sect1 id="features.file-upload.put-method">
   <title>PUT Ynetmi Deste&gbreve;i</title>

   <para>
    PHP Netscape Composer ve W3C Amaya gibi programlar&inodot;n kulland&inodot;&gbreve;&inodot; HTTP PUT 
	yntemini de destekler. PUT i&scedil;lemi, bir dosya ykleme i&scedil;leminden
	daha basittir ve a&scedil;a&gbreve;&inodot;daki gibidir:
    <informalexample>
     <programlisting>
PUT /path/filename.html HTTP/1.1
     </programlisting>
    </informalexample>
   </para>
   <para>
    Bu &scedil;u demektir: dosyay&inodot; ykleyen, dosyay&inodot;, web dzeniniz iindeki
	/path/filename.html iine kaydetmek istemektedir.
    Tm kulan&inodot;c&inodot;lar&inodot;n, web dizini iindeki herhangi bir dosyan&inodot;n zerine yazmak
	Apache ve PHP iin kesinlikle iyi bir fikir de&gbreve;ildir.
	Bu tr bir i&scedil;lemi kontrol alt&inodot;na almak iin, web sunucunuza byle bir i&scedil;lem iin
	belirli bir PHP dosyas&inodot;n&inodot; kullanmas&inodot;n&inodot; sylemelisiniz. Apache'de bu i&scedil;lem <emphasis>Script</emphasis>
	direktifi ile yap&inodot;lmaktad&inodot;r. Bu direktif, Apache'nin konfigursasyon dosyas&inodot;nda
	herhangi bir yere konulabilir.  Genellikle &lt;Directory&gt; blo&gbreve;unun
	veya &lt;Virtualhost&gt; blo&gbreve;unun iine konur.
	Bunun gibi bir sat&inodot;r i&scedil;inizi grecektir:
    <informalexample>
     <programlisting>
Script PUT /put.php
     </programlisting>
    </informalexample>
   </para>
   <simpara>
   Bu sat&inodot;r, Apache'ye, tm PUT istemlerini, ekledi&gbreve;imiz sat&inodot;rda bulunan
   put.php dosyas&inodot;na gndermesini syler. Bu rnek, .php uzant&inodot;s&inodot;n&inodot;n al&inodot;&scedil;&inodot;r oldu&gbreve;u
   ve PHP nin aktif oldu&gbreve;u varsay&inodot;larak verilmi&scedil;tir.
   </simpara>
   <simpara>
   
    put.php dosyan&inodot;zda, &scedil;yle bir&scedil;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&scedil;lem, dosyay&inodot;, i&scedil;elemi yapan ki&scedil;inin istedi&gbreve;i klasre kopyalar.
    Bu kopyalama i&scedil;lemini gerekle&scedil;tirmeden nce, baz&inodot; kontroler ve/veya
	giri&scedil; kontrolleri yapmak isteyebilirsiniz.
    &Idot;stek sonland&inodot;&gbreve;&inodot;nda, bu geici dosya silinir.  Dolay&inodot;s&inodot; ile
	i&scedil;lemi gerekle&scedil;tiren dosyan&inodot;z, bu dosyay&inodot; ba&scedil;ka bir yere kopyalamal&inodot;d&inodot;r.
	Bu geici klasrdeki dosya ad&inodot; $PHP_PUT_FILENAME de&gbreve;i&scedil;kenindedir
	ve iste&gbreve;i gnderenin belirledi&gbreve;i dosya ad&inodot;n&inodot; $REQUEST_URI 
	(Apache d&inodot;&scedil;&inodot;ndaki web sunucularda de&gbreve;i&scedil;ebilir) de&gbreve;i&scedil;keninde grebilirsiniz.
    Bu belirtilen dosya ad&inodot;, dosyay&inodot; gnderenin belirledi&gbreve;i dosya ad&inodot;d&inodot;r.
	Bu iste&gbreve;i gerekle&scedil;tirmek zorunda de&gbreve;ilsinizdir. rne&gbreve;in
	tm dosyalar&inodot;, belirledi&gbreve;iniz bir klasre 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
-->