Mehmet Fatih YILDIZ (mfyz.com)

Menü



PHP ile dosya gönderimi (upload)

Kategori : PHP ve Pear Dökümanları
Eklenme Tarihi :
1 Şubat Çarşamba ´06
upload




Dikkat : Dökümanın yazılma tarihi üzerinden en az 60 gün (2 ay) geçmiş. İçerisindeki bilgiler güncelliğini yitirmiş olabilir, uygulamada ufak sorunlar oluşabilir. Yorumları ve güncellemeleri göz önünde bulundurarak dökümanı 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.

  1. <form action="yukle.php" method="post" enctype="multipart/form-data">
  2.   Gönderilecek dosya: <input name="dosya_yukle" type="file">
  3.   <input type="submit" value="Gönder">
  4. </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.

  1. <?php
  2. // sayfanin ilk açilisinda herhangi bir islem yapmamak için böyle bir degisken
  3. // varmi diye bakiyoruz
  4.  
  5.    if( isset($_FILES['dosya_yukle']) ){
  6.      // error degerinin 0 olmadigi tüm durumlar hatalidir.
  7.      // Buradan faydalanarak eger hata varsa ekrana basiyoruz yok ise isleme geçiyoruz.
  8.         if( $_FILES['dosya_yukle']['error'] ){
  9.           echo 'Bir hata olustu ve dosyaniz alinamadi.';
  10.         }else{
  11.           copy($_FILES['dosya_yukle']['tmp_name'],'./upload/'.
  12.                $_FILES['dosya_yukle']['name']);
  13.           echo '<h4>Dosyaniz alindi.</h4> Alinan dosya bilgileri <br/>Isim:'.
  14.                $_FILES['dosya_yukle']['name'].'<br/>';
  15.           echo 'Boyut: '.($_FILES['dosya_yukle']['size']/1024).' KB<br>';
  16.           echo 'Türü : '.($_FILES['dosya_yukle']['type'].'<hr>';
  17.          } // if
  18.  
  19.     } // if
  20. ?>
  21. <form action="yukle.php" method="post" enctype="multipart/form-data">
  22.   Gönderilecek dosya: <input name="dosya_yukle" type="file">
  23.   <input type="submit" value="Gönder">
  24. </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 (5 yorum/ping var)



Üye Resmi Ziyaretçi : emre kutlu
28 Nisan Pazartesi ´08 22:35 tarihinde yazmış
16. satırda unexpected ';'  hatası alıyorum. O satırı silince problem kalkıyor. Baktım ama nedenini bulamadım.
 


Üye Resmi Ziyaretçi : emre kutlu
28 Nisan Pazartesi ´08 22:38 tarihinde yazmış
yeni farkettim, açılan parantez kapatılmamış ondan..
 


Üye Resmi Ziyaretçi : emre kutlu
29 Nisan Salı ´08 03:33 tarihinde yazmış
bir de şöyle bir sorunum var isset kontrolü yaptırmama rağmen 4 numaralı hatayı alıyorum. (UPLOAD_ERR_NO_FILE)
 


Üye Resmi Ziyaretçi : zehra
10 Mart Çarşamba ´10 15:29 tarihinde yazmış
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 Ziyaretçi : zehra
10 Mart Çarşamba ´10 15:37 tarihinde yazmış
wamp ın diğer sürümlerndede çalşrmı bisorun olurmu??
benimki 1.7.0
 


Yeni Yorum

Önce Okuyun Yorumlarınızda sosyal, dini ve politik taraflı mesajlar, başkalarına saldırı sayılabilecek laflardan kaçının. Argo kelimeler, küfürler otomatik olarak silinecektir. Bu kural ihlalleri ip, üyelik, isiminizin banlanmasına yol açabilir.

Lütfen yardıma yönelik, konuyu uzatacak sorularınızı/yorumlarınızı forumda yazınız. Burası konu dahilindeki kısa soluklu öneri/yorumlar içindir. Aksi halde yorumunuzu göremeyebilir, uyarı alabilirsiniz.

Hatırlatmak amacıyla : html kodlarının, link yapmak, vb amacıyla gireceğiniz ekstra bilimum şeylerin çalışmayacağını belirteyim. Yorumlayıcı zaten linklerinizi otomatik çevirecek, gülücüklerinizi dönüştürecektir. Zengin metin özellikleri için araç çubuğundaki butonları kullanın.


İletişim Bilgileri


E-Posta adresiniz gösterilmeyecektir.

(unut)

Üye iseniz, giriş yapıp bu bilgileri girmeden hızlıca yorum yapabilirsiniz. Yorumunuzda resminiz/ikonunuz ve profil bağlantınız görüntülenecek, aynı zamanda güvenlik kodu girmek zorunda da kalmayacaksınız.
Üye olmak için buraya tıklayın.

Güvenlik Kodu
Güvenlik kodunu göremiyorsanız sayfayı yenileyin!


Yukarıdaki güvenlik kodunu bu kutuya yazın.

Yorum   
- +

Ad soyad, eposta ve yorum alanları
(⊗ işaretli alanlar) zorunludur.





mfyz.com'da şu an 11 ziyaretçi geziniyor. Toplam 114 makale, 208 yazı, 3000 gönderi var



  • RSS mfyz.com'u RSS beslemeleri ile takip edebilirsiniz
  • ServerTR Hosting Sponsoru ServerTR.com'a çok teşekkür ederiz
  • CC 2.5 Sitedeki materyalleri Creative Commons 2.5 Lisansı çerçevesinde kullanabilirsiniz. Lisans hakkında bilgi almak için tıklayın
  • İstatistikler Site ziyaret istatistikleri, konu, eğilim gibi ilginç istatistikler hakkında
  • Site Hakkında Site altyapısı, hazırlanışı, kurallar ve felsefesi hakkında
  • İletişim İletişim formu, iletişim bilgileri

mfyz.com Türk Programcılığının Gelişmesine Adanmıştır
HTML Standartlarına Uygundur

CSS Standartlarına Uygundur