PHP dosya yükleme sorunu

4 Cevap php

Ben dosya yüklemeleri ile gerçekten can sıkıcı bir sorun var.

Kullanıcılar, bir html dosyası alanında bir dosya seçebilirsiniz. Bu formu göndermek, bu dosya yüklenir.

Serverside ben sadece standart PHP kodu (move_uploaded_file) kullanın. Ben garip bir şey yok.

Her şey mükemmel çalışıyor.

Ben sunucu üzerinde dosya görebilirsiniz, ben tekrar indirebilirsiniz ...

Ancak bazen bu çalışmıyor. Ben dosya, süreç upload ve ben hiç hata olsun.

Ancak dosyası sadece sunucuda yok.

Ben özel dosya Hiçbir hata olsun ama kurtulur asla yüklemek her zaman.

Bunu (örneğin tst.file için test.file) yeniden adlandırmak sadece bunu yükleyebilirsiniz ve aslında kaydedilmiş alırsınız.

Ben çok nadiren bu sorunu olsun. Ve her zaman yeniden adlandırma çalışır. Ama ben açıkçası onların dosyaları yeniden adlandırmak için kullanıcılar sormak değil ...

Ben apache tmp dosya dizine erişimi hiç olmayan, günlükleri ya da ayarlara erişim yok bu nedenle bu hata ayıklama bile zor yapar. Ben sadece bu belirli bir sunucuda bu sorunu (I yönetmek değil ki, ben bile buna erişim yok) ve ben bu sorunu yok sunucuların çok üzerinde aynı kodu kullanabilirsiniz.

Burada birisi bana yardımcı olabilir veya doğru yönde bana gelin, ben minnettar olacaktır.

4 Cevap

Bu hata ayıklama kodu ekleyerek çalışılıyor:

echo '<pre>';
print_r($_FILES);
echo '</pre>';

Bir hata numarası görmelisiniz. Bunu http://uk3.php.net/manual/en/features.file-upload.errors.php ne anlama geldiğini arama yapabilirsiniz

Ayrıca hedef dosya zaten yok emin olmak için kontrol değerinde olabilir.

Bir yükleme failes Eğer bir PHP sözdizimi hatası ya da bu gibi hata aynı tür alamadım.

Ama file upload status kontrol ve kullanıcıya kendiniz hatayı bildirebilirsiniz.

Benim ilk düşünce dosya boyutu konular oldu. Dosya sadece yok gibi görünüyor - post_max_size veya upload_max_filesize çok küçük ise php.ini olarak, benzer sonuçlar ile sona erebilir. (Size hiçbir erişim ettik bahsetmiyorum) apache günlükleri bir hata olacaktı.

Bu gibi durumlarda, $ _FILES dizi sadece boş olurdu - dosya asla geldi sanki. Gumbo ve James Hall php uygun bir yükleme bildiriyor göstermek için yanıtları beri, ben size söz işleme hakkında merak yol açtı ediyorum.

Işlemi sırasında, bellek maxed veya komut çok uzun çalıştırır alır, eğer onu taşımak için bir şans olur önce, komut dosyası dışarı ölüyor olabilir. Bu kontrol etmek isteyeceksiniz:

memory_limit

max_execution_time

max_input_time

Aksi takdirde, apache günlükleri olmadan, ben bu dosya işleme komut boyunca kendi bir günlük dosyası çıktısı başlamak için iyi bir fikir olabilir derim. Tmp dosya üzerinde bir file_exists deneyin, dosyanın (izinler, vb) alabilirsiniz ne bilgi bkz.

Ancak aslında sonra - yükleme bitene kadar ne yazık ki PHP sırasında çok fazla bilgi almak anlamına gelir ki, yer almaz. Sen iyi seçenek hosting şirketi konuşmak ve günlüklerine erişim almak için olabilir - hatta kısa bir süre için bile. Ya da en azından ben paylaşılan bir sunucu kendi günlüklerini bölmez durumda (testler sırasında benim için günlükleri kontrol etmek için bir teknoloji alıyorsanız - - Benim durumumda, ben sorun ot günlükleri almak vardı nadiren yaşadığınız saçma görünüyor, ama I) daha önce de gördüm.

Düzenleme: Ben bu php ayarlarını değiştiremezsiniz farkındayım, ama onlar sizin komut için potansiyel problemleri eğer öğrenmek için onlar için ne olduğunu görmek isteyebilirsiniz. Bu yüklenen dosya boyutundan daha az ise Örneğin, düşük bellek sınırı işlemci komut öldürecek.

Bu ne söylenir ...

. "Ben apache tmp dosyası dizinine erişimi yok, günlükleri ya da ayarlara erişim yok bu nedenle bu hata ayıklama da zor Ben sadece yönetmek değil bu özel sunucu (bu sorun yapar, ben bile erişimi yok o) ve ben bu sorunu yok sunucuların çok üzerinde aynı kodu kullanabilirsiniz. "

Eğer yukarıda söylediğine göre, ben birçok kullanıcı arasında paylaşılan bir sunucu kullanıyorsanız varsayalım. Bu sunucunun Apache "mod_suphp" gibi bir şey ile yapılandırılmış ise, PHP betikleri "Oluşturduğunuz dosyaların (sana sahip olacağı anlamına gelir, (örneğin," jef1234 ") UNIX kullanıcı hesabının ayrıcalıklarını kullanarak idam edilecek apache "veya" www-data ")" sahibinin (yerine as) "jef1234.

Sistemin geçici dizin (genellikle "/ tmp"), genellikle üzerinde "Yapışkan bit" ile yapılandırılır. Bu herkes bu dizinde dosya oluşturmak anlamına gelir, ancak oluşturulan dosyalar (Eğer oluşturduğunuz biri olarak bu tedavi olabilir) sadece sahibi tarafından erişilebilir.

Sunucu yapılandırma yeterince dikkatli değilse bir sonucu olarak, diğer kullanıcıların dosyaları ile adlandırma çarpışmalarını dosya olabilir. Başka bir kullanıcı zaten aynı adla başka bir dosya yükledi böylece eğer başka bir isim kullanmak zorunda gibi Örneğin, "test.file" yüklediğinizde, sistem, kendisi tarafından yaratılan dosyanın üzerine reddediyor.

PHP yüklenen dosya için geçici adları (örneğin, $ _FILES ["html_form_input_name"] ["tmp_name"]) üretmek için yeterince akıllı olduğu için genellikle sorun yoktur. Nasılsa bu gerçekten nedeni olduğunu teyit edebilir, sunucu açıkça hatalı yapılandırılmış. Bunu çözmek için onu sormak gibi sistem yöneticisine sorun söyle. Bu çözülemedi Eğer (sadece bir fikir test değil) yüklenir önce, dosyanın adına bazı JavaScript hileler yapabilir ...

Kullanıcı formu gönderdiğinde , örneğin, dosyayı yeniden adlandırmak, "test.file" için "jef1234-test.file-jef1234". Dosya yüklendikten sonra, başka bir yere (yani move_uploaded_file()) dosyayı taşımak ve ekledi dizeleri kaldırarak orijinal dosya yeniden adlandırın.

Bu yardımcı olur umarım ...

Asuka Kenji