PHP ile dosya gönderimi (upload)

1 Şubat Çarşamba ´06
Dikkat: Bu yazının yazılma tarihinin üzerinden en az 60 gün geçmiş. İçerisindeki bilgiler güncelliğini yitirmiş olabilir. Yorumları ve güncellemeleri göz önünde bulundurarak yazıyı takip ediniz.
Php ile dosya gönderimi işlemleri oldukça kolaydır. Burada dosya gönderiminin nasıl yapılabileceği hakkında bilgi vermeye çalışacağım. Gönderilen dosyaları veritabanında saklamak vs gibi işlemlere değinmeyeceğim. Öncelikle formumuzu tanımlarken enctype="multipart/form-data" yüklemini eklemeniz gerektiğini hatırlatmak istiyorum. Örnek bir dosya gönderme formu aşağıdaki gibi olabilir.
<form action="yukle.php" method="post" enctype="multipart/form-data">
  Gönderilecek dosya: <input name="dosya_yukle" type="file">
  <input type="submit" value="Gönder">
</form>
Dosya Gönderimi desteği için sunucunun ayarlarında aşağıda belirtilen ayarları gözden geçirmeyi unutmayın. ( phpinfo(); ile görebilirsiniz )
file_uploads          Dosya gönderimi izni. "Açık"/"On" konumunda olmalıdır.

upload_max_filesize   Sunucu ayarındaki maximum dosya boyutu izni.
                      Varsayılanı 2M sanırım.

upload_tmp_dir        Gönderilen dosyaların tutulacağı geçici dizin. 
                      Eğer "no value" ise işletim sisteminizin sağladığı
                      geçici klasörü kullanır.

post_max_size         Aslında post ile gönderilebilecek en yüksek veri
                      boyutunu belirtir ama dolaylı olarak
                      dosya gönderimini de etkiler.
PHP, gönderilen dosyaları php.ini deki ayarlar doğrultusunda geçici klasöre geçici bir isimle kaydeder ve gerekli bilgileri $_FILES adlı özel bir değişkende aşağıdaki şekilde kaydeder. ( PHP'nin 4.1.0 sürümü öncesi $_FILES değişkeni yerine $HTTP_POST_FILES kullanılıyordu )

Örneğimizdeki form yoluyla herhangi bir dosya gönderildiğinde yukle.php dosyamızda $_FILES değişkeninin içeriği aşağıdaki gibi olacaktır.
$_FILES['dosya_yukle']['name']       Gönderilen dosyanın orjinal adı.
$_FILES['dosya_yukle']['type']       Eğer tarayıcı tarafından sağlanmışsa dosyanın
                                     mime türü. ( örneğin: image/gif )
$_FILES['dosya_yukle']['size']       Byte cinsinden gönderilen dosyanın boyutu.
$_FILES['dosya_yukle']['tmp_name']   Sunucudaki geçici dosyanın adı.
$_FILES['dosya_yukle']['error']      İşlemle ilgili hata kodu.
                                     Bu PHP 4.2.0 ve sonrasında eklenmiştir.
Burada dosya_yukle olarak geçen ismi biz formda atamış olduk. Yukarıdaki örnekte ilgili alana ne isim verilmişse o isimle kaydedilecektir. Bu sayede birden fazla dosyayı tek seferde gönderebilirsiniz.

'error' parametresinin alabileceği değerler hakkında;
0   Yükleme işleminde herhangi bir hata ile karşılaşılmadığı anlamına gelir.
1   php.ini de belirtilmiş olan upload_max_filesize ayarını
    aşan boyutta bir dosya gönderilmeye çalışılıyor.
2   Formdaki MAX_FILE_SIZE alanının değerini aşan bir dosya.
    Bunu aşağıda tekrar ele alacağım.
3   Dosya gönderimi tam olarak tamamlanamadı. Yarım kalan dosya iptal edilir.
4   Dosya yüklenemedi.
6   Geçici dosya bulunamıyor. ( PHP 4.3.10 ve PHP 5.0.3. sürümlerinde eklendi. )
7   Sürücüye yazılamıyor ( PHP 5.1.0 de eklendi. )
Ayrıca PHP 4.3.0. sürümünden sonra aşağıdaki gibi hata sabitleride tanımlanmıştır.
0 = UPLOAD_ERR_OK
1 = UPLOAD_ERR_INI_SIZE
2 = UPLOAD_ERR_FORM_SIZE
3 = UPLOAD_ERR_PARTIAL
4 = UPLOAD_ERR_NO_FILE
6 = UPLOAD_ERR_NO_TMP_DIR
7 = UPLOAD_ERR_CANT_WRITE
Eğer kullanıcının tarayıcısı bir şekilde bize ['type'] alanını sağlamıyorsa; bunu mime_content_type() fonksiyonunu kullanarak bulabiliriz. Ancak bildiğim kadarıyla bu fonksiyon sadece Linux ortamında çalışacaktır. Tam mime listesini bilmek hiçbir zaman mümkün olmayacaktır, ancak en güncel olarak http://www.duke.edu/websrv/file-extensions.html adresinden ulaşabilirsiniz.

Hata 2 : Eğer istersek formumuzda şeklinde bir alan daha tanımlayarak kullanabiliriz. Avantajı, dosya daha sunucuya gönderilmeden önce boyut kontrolünden geçirildiği ve işleme buna göre devam edildiğinden boyutu limiti aşacak olan dosya sunucuya gönderilmeden önce işlem iptal edilmiş olur. Ayrıca, herhangi bir ayarı tamamiyle kullanıcının denetimindeki bir ortama göndererek ondan gizlemeye çalışmak mantıklı olmayacağından tavsiye edilmez. Çünkü hidden özelliği sadece html ile ilgili bir durumdur. Kullanıcı, "gizli olsa dahi" bu değeri değiştirebilir. Eğer herhangi bir şekilde dosya boyutu kontrolü yapmak istiyorsak bunun yanısıra php içerisinde ['size'] değişkeniyle gelen değeri kontrol ederek yapabiliriz ki bu şekilde daha güvenli olacaktır.

Sanırım artık bir örnek ile sonlandırmalıyım. Yukarıdaki formumuza basit bir php programı entegre edeyim.
<?php
// sayfanin ilk açilisinda herhangi bir islem yapmamak için böyle bir degisken
// varmi diye bakiyoruz

   if( isset($_FILES['dosya_yukle']) ){
     // error degerinin 0 olmadigi tüm durumlar hatalidir.
     // Buradan faydalanarak eger hata varsa ekrana basiyoruz yok ise isleme geçiyoruz.
        if( $_FILES['dosya_yukle']['error'] ){
          echo 'Bir hata olustu ve dosyaniz alinamadi.';
        }else{
          copy($_FILES['dosya_yukle']['tmp_name'],'./upload/'.
               $_FILES['dosya_yukle']['name']);
          echo '<h4>Dosyaniz alindi.</h4> Alinan dosya bilgileri <br/>Isim:'.
               $_FILES['dosya_yukle']['name'].'<br/>';
          echo 'Boyut: '.($_FILES['dosya_yukle']['size']/1024).' KB<br>';
          echo 'Türü : '.($_FILES['dosya_yukle']['type'].'<hr>';
         } // if

    } // if
?>
<form action="yukle.php" method="post" enctype="multipart/form-data">
  Gönderilecek dosya: <input name="dosya_yukle" type="file">
  <input type="submit" value="Gönder">
</form>
Tabi bu kod sadece örnek olduğu için fazlaca karışmasını istemedim. dosya türü yada boyutu sınaması yapabilirdik oluşan hataya göre farklı ve tam olarak hatanın ne olduğunu anlatan mesajlar verebilirdik, yada copy fonksiyonu görevini yerine getiremezse (yazma izinleri ?) bu durumda yine hata mesajı verdirebilirdik.

Kaynaklar;
http://tr.php.net/manual/en/function.mime-content-type.php
http://tr.php.net/manual/en/features.file-upload.php
http://tr.php.net/manual/en/features.file-upload.errors.php


Hazırlayan : Orhan KURNAZ

Yorumlar

Üye Resmi emre kutlu
28 Nisan Pazartesi ´08 22:35
16. satırda unexpected ';'  hatası alıyorum. O satırı silince problem kalkıyor. Baktım ama nedenini bulamadım.
Üye Resmi emre kutlu
28 Nisan Pazartesi ´08 22:38
yeni farkettim, açılan parantez kapatılmamış ondan..
Üye Resmi emre kutlu
29 Nisan Salı ´08 03:33
bir de şöyle bir sorunum var isset kontrolü yaptırmama rağmen 4 numaralı hatayı alıyorum. (UPLOAD_ERR_NO_FILE)
Üye Resmi zehra
10 Mart Çarşamba ´10 15:29
teşekkür ederm ödevim için çok ii oldu.gönderm yapıo ama 21 de hata :
Warning: copy(./upload/ads&&#35;305;z.GIF) [function.copy]: failed to open stream: No such file or directory in C:\wamp\www\yukle.php on line 22
dio onu nasıl düzeltebilirim???
Üye Resmi zehra
10 Mart Çarşamba ´10 15:37
wamp ın diğer sürümlerndede çalşrmı bisorun olurmu??
benimki 1.7.0
Üye Resmi şeyhmus söylemez
18 Mayıs Cumartesi ´13 01:45
abicim merhaba,
ben sınıf öğretmeniyim benim egitim-ogretim.com diye bir sitem var bu siteyi devr almıştım birinden. Yalnız sitenin yöneticisi kendi panelinden dosya yükleyebiliyor ben ziyaretçileriminde benim kontrolüm altında dosya yüklemesini istiyorum yükleme formu oluşturmak için çok araştrıdım uğraştım yapamadım yani aslında php falan pek bilgim yok.
Acaba dosya kategorilerime göre ziyaretçilerin dosya yüklemesini bu dosyaları onaylaamam ssorası sitede yayınlmaını nasıl yapabilir.
Örnek site mesela dosyabak.com sitesinin çok basit ve güzel olmuş o tarz bi şey nasıl yapabilirm yada ne biliyim ücretli ucuza birine yaptıramazmıyım kolay gelsin
Üye Resmi Merih Özüdogru
10 Eylül Salı ´13 17:20
cok kaba bir anlatım olmus hocam  
"Burada dosya gönderiminin nasıl yapılabileceği hakkında bilgi vermeye çalışacağım. Gönderilen dosyaları veritabanında saklamak vs gibi işlemlere değinmeyeceğim."
demişsin ancak bu olayı anlattıgını sanmıyorum yarım kalmış
ben "Burada dosya gönderiminin nasıl yapılabileceği hakkında bilgi vermeye çalışacağım. Gönderilen dosyaları veritabanında saklamak vs gibi işlemlere değinmeyeceğim."
yazısını okuduktan sonra

örnegin...  yukle.php dosyası olusturup içerisine şu şu kodları yazıyoruz..
bu kodlar  bu işe yarar... ardından yazdıgımız bu kodlar ise dosyayı bu dosya.php  sayfasına göndermeye yarar.
dosya.php sayfasıan yazdıgımız (fopen(“./dosya.txt”, ”r”)); gibi bi kodla da yukledigimiz dosyayı acar R parametresi ilede dosyayı sadece okumak için açtıgımızı ifade ederiz. .....

gibi bi açıklama beklemiştim

siz bu yazıyı 06 da yazmıs olabilirsiniz ama zaman akıyor ve bu yazı hala burada duruyor ....
saygılarımla
Üye Resmi silinen dosya
10 Eylül Perşembe ´15 18:02
Parentezi kapattığında sorun kalmaz 16. satırda unexpected ';'  hatası alıyorum. O satırı silince problem kalkıyor. Baktım ama nedenini bulamadım.
Yeni Yorum *
İletişim Bilgileri
*
*
E-Posta adresiniz gösterilmeyecektir.
(unut)
Güvenlik Kodu *

Gönderiliyor