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.
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.
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.
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
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.
16. satırda unexpected ';' hatası alıyorum. O satırı silince problem kalkıyor. Baktım ama nedenini bulamadım.
Ziyaretçi : emre kutlu
28 Nisan Pazartesi ´08 22:38 tarihinde yazmış
yeni farkettim, açılan parantez kapatılmamış ondan..
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)
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&#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???
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