Saya telah menginstal WampServer 2 di komputer Windows 7 saya. Saya menggunakan Apache 2.2.11 dan PHP 5.2.11. Ketika saya mencoba untuk mengunggah file apa pun dari formulir, sepertinya akan mengunggah, tetapi dalam PHP, $_FILES
arraynya kosong. Tidak ada file dic:\wamp\tmp
folder. Saya telah mengkonfigurasi php.ini
untuk mengizinkan unggahan file dan semacamnya. The tmp
folder telah membaca hak / tulis untuk pengguna saat ini. Saya bingung.
HTML:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<form enctype="multipart/form-data" action="vanilla-upload.php" method="POST">
Choose a file to upload: <input name="uploadedfile" type="file" /><br />
<input type="submit" value="Upload File" />
</form>
</body>
</html>
PHP:
<?php
echo 'file count=', count($_FILES),"\n";
var_dump($_FILES);
echo "\n";
?>
php
apache
file-upload
elmonty
sumber
sumber
vanilla-upload.php
?Jawaban:
Berikut daftar periksa untuk mengunggah file dalam PHP:
Periksa php.ini untuk:
file_uploads = On
post_max_size = 100M
upload_max_filesize = 100M
.htaccess
atau.user.ini
jika Anda menggunakan hosting bersama dan tidak memiliki akses kephp.ini
.phpinfo()
fungsi ini untuk memverifikasi bahwa pengaturan Anda benar-benar diterapkan.100M
tidak100MB
.Pastikan
<form>
tag Anda memilikienctype="multipart/form-data"
atribut. Tidak ada tag lain yang berfungsi, itu harus menjadi tag FORMULIR Anda. Periksa kembali apakah itu dieja dengan benar . Periksa ulang apakah multipart / formulir-data dikelilingi oleh KUTIPAN LURUS, bukan kutipan cerdas yang disisipkan dari Word ATAU dari blog situs web (WordPress mengonversi kutipan langsung menjadi kutipan sudut!). Jika Anda memiliki beberapa formulir di halaman, pastikan keduanya memiliki atribut ini. Ketikkan secara manual, atau coba langsung satu kutip yang diketikkan secara manual.Pastikan Anda tidak memiliki dua bidang file input dengan
name
atribut yang sama . Jika Anda perlu mendukung banyak, letakkan tanda kurung di akhir nama:Pastikan direktori tmp dan unggah Anda memiliki izin baca + tulis yang benar. Folder unggahan sementara ditentukan dalam pengaturan PHP sebagai
upload_tmp_dir
.Pastikan tujuan file Anda dan direktori tmp / unggah tidak memiliki spasi di dalamnya.
Pastikan semua yang ada
<form>
di halaman Anda memiliki</form>
tag penutup.Pastikan tag FORMULIR Anda sudah
method="POST"
. Permintaan GET tidak mendukung unggahan multipart / formulir-data.Pastikan tag input file Anda memiliki atribut NAME. Atribut ID TIDAK memadai! Atribut ID untuk digunakan dalam DOM, bukan untuk muatan POST.
Pastikan Anda tidak menggunakan Javascript untuk menonaktifkan
<input type="file">
bidang Anda saat pengirimanPastikan Anda tidak suka bentuk sarang
<form><form></form></form>
Periksa struktur HTML Anda untuk tag yang tidak valid / tumpang tindih
<div><form></div></form>
Pastikan juga file yang Anda unggah tidak memiliki karakter non-alfanumerik di dalamnya.
Suatu kali, saya hanya menghabiskan waktu berjam-jam untuk mencari tahu mengapa ini terjadi pada saya secara tiba-tiba. Ternyata saya telah memodifikasi beberapa pengaturan PHP
.htaccess
, dan salah satunya (belum yakin mana) yang menyebabkan unggahan gagal dan$_FILES
kosong.Anda berpotensi mencoba menghindari garis bawah (
_
) padaname=""
atribut<input>
tagCoba unggah file yang sangat kecil untuk mempersempit apakah itu masalah ukuran file.
Periksa ruang disk Anda yang tersedia. Meskipun sangat jarang, disebutkan dalam komentar halaman Manual PHP ini :
Pastikan Anda tidak mengirimkan formulir melalui permintaan POST AJAX alih-alih permintaan POST normal yang menyebabkan halaman dimuat ulang. Saya memeriksa setiap poin dalam daftar di atas, dan akhirnya menemukan bahwa alasan variabel $ _FILES saya kosong adalah karena saya mengirimkan formulir menggunakan permintaan POST AJAX. Saya tahu bahwa ada metode untuk mengunggah file menggunakan ajax juga, tetapi ini bisa menjadi alasan yang valid mengapa array $ _FILES Anda kosong.
Sumber untuk beberapa poin ini:
http://getluky.net/2004/10/04/apachephp-_files-array-mysteriously-empty/
sumber
<form><form><input type="file"></form></form>
$('#my-form')[0].reset();
di handler kirim.Sejauh HTML Anda tampaknya telah mengatur bagian itu dengan benar. Anda sudah memiliki
enctype="multipart/form-data"
yang sangat penting untuk ada di formulir.Sejauh
php.ini
pengaturan Anda , kadang-kadang pada sistem ada beberapaphp.ini
file. Pastikan Anda mengedit yang benar. Saya tahu Anda mengatakan Anda telah mengonfigurasiphp.ini
file Anda untuk mengunggah file, tetapi apakah Anda juga mengaturupload_max_filesize
danpost_max_size
menjadi lebih besar dari file yang ingin Anda unggah? Jadi, Anda harus memiliki:Apakah direktori Anda:
"c:\wamp\tmp"
memiliki izin baca dan tulis? Apakah Anda ingat untuk me-restart Apache setelah Anda melakukanphp.ini
perubahan?sumber
Penting untuk menambahkan
enctype="multipart/form-data"
ke formulir Anda, misalnyasumber
Terima kasih semuanya atas jawaban komprehensif yang beragam. Itu semua sangat membantu. Jawabannya ternyata sangat aneh. Ternyata PHP 5.2.11 tidak menyukai yang berikut ini:
atau
Jika saya mengubahnya
2047M
, pengunggahan berfungsi.sumber
Saya memiliki masalah yang sama dalam 2 jam, sangat mudah untuk memeriksa konfigurasi server kami terlebih dahulu.
Contoh:
semua jenis ukuran file
:20mb
, tetapi kami diupload_max_size
atas20mb
tetapi arraynull
. Jawabannya adalah kitapost_max_size
harus lebih besar dariupload_max_filesize
sumber
Di sini penyebab lain yang saya temukan: Ketika menggunakan JQuery Mobile dan atribut data formulir-ajax disetel ke true, array FILES akan kosong. Jadi atur data-ajax ke false.
sumber
Pastikan elemen input Anda memiliki atribut 'nama'.
<input type="file" name="uploadedfile" />
Jika ini tidak ada, $ _FILES akan kosong.
sumber
Saya berjuang dengan masalah yang sama dan menguji semuanya, tidak mendapatkan pelaporan kesalahan dan sepertinya tidak ada yang salah. Saya mengalami error_reporting (E_ALL) Tapi tiba-tiba saya menyadari bahwa saya belum memeriksa log apache dan voilà! Terjadi kesalahan sintaksis pada skrip ...! ("}" yang hilang
Jadi, meskipun ini adalah sesuatu yang jelas untuk diperiksa, itu bisa dilupakan ... Dalam kasus saya (linux) itu ada di:
sumber
Tidak ada yang menyebutkan ini tetapi itu membantu saya dan tidak banyak tempat di internet yang menyebutkannya.
Pastikan php.ini Anda menetapkan kunci berikut:
Anda harus memeriksa dengan hosting Anda jika mereka ingin Anda menggunakan jalur file server absolut. Anda harus dapat melihat contoh direktori lain di file php.ini Anda untuk menentukan ini. Segera setelah saya atur, saya mendapat nilai di objek _FILES saya.
Akhirnya pastikan bahwa folder tmp Anda dan di mana pun Anda memindahkan file memiliki izin yang benar sehingga mereka dapat dibaca dan ditulis.
sumber
Jika Anda mencoba untuk meng-upload sebuah array dari file maka Anda mungkin perlu untuk meningkatkan
max_file_uploads
diphp.ini
mana adalah dengan set default20
Catatan :
max_file_uploads
TIDAK BISA diubah di luar php.ini. Lihat PHP "Bug" # 50684sumber
Penyebab lain yang mungkin adalah pengalihan apache. Dalam kasus saya, saya memiliki httpd.conf apache yang diatur untuk mengalihkan halaman tertentu di situs kami ke versi http, dan halaman lain untuk https versi halaman, jika belum. Halaman di mana saya memiliki formulir dengan input file adalah salah satu halaman yang dikonfigurasikan untuk memaksa ssl, tetapi halaman yang ditunjuk sebagai aksi formulir dikonfigurasikan menjadi http. Jadi halaman tersebut akan mengirimkan unggahan ke versi ssl dari halaman tindakan, tetapi apache mengarahkannya ke versi http halaman dan data pos, termasuk file yang diunggah hilang.
sumber
Periksa php.ini Anda untuk enable_post_data_reading = Hidup , karena:
Di http://php.net/manual/en/ini.core.php#ini.enable-post-data-reading
sumber
Jika skrip utama Anda
http://Some_long_URL/index.php
berhati-hati untuk menentukan URL lengkap (dengan eksplisitindex.php
dan tidak hanyahttp://Some_long_URL
) diaction
bidang. Anehnya, jika tidak, skrip yang tepat dieksekusi, tetapi dengan id kosong $ _FILES!sumber
Saya mengalami masalah yang sama dan menemukan bahwa itu IDE saya adalah bagian dari masalah. Saya meluncurkan debugger langsung dari IDE (PHPStorm) alih-alih hanya menggunakan browser secara langsung. URL yang dihasilkan IDE adalah seperti ini:
dan hanya menggunakan:
bekerja dengan baik. Pengaturan saya adalah PC / Windows 10 / WAMPSERVER 3.0.6 64bit
sumber
Jangan percaya lokasi folder temp yang disediakan oleh
sys_get_temp_dir
jika Anda berada di lingkungan hosting bersama.Berikut ini satu hal lagi untuk diperiksa yang belum disebutkan ...
Saya berasumsi, secara alami, bahwa folder tempat skrip PHP saya menyimpan unggahan file sementara
/tmp
. Keyakinan ini diperkuat oleh fakta yang munculecho sys_get_temp_dir() . PHP_EOL;
kembali/tmp
. Juga,echo ini_get('upload_tmp_dir');
tidak mengembalikan apa pun.Untuk memverifikasi bahwa file yang diunggah sebenarnya muncul sebentar di
/tmp
folder saya , saya menambahkansleep(30);
pernyataan ke skrip saya (seperti yang disarankan di sini ) dan menavigasi ke/tmp
folder saya di cPanel File Manager untuk menemukan file. Namun, apa pun itu, file yang diunggah tidak ditemukan di sana.Saya menghabiskan waktu berjam-jam untuk menentukan alasannya, dan menerapkan setiap saran yang ditawarkan di sini.
Akhirnya, setelah mencari file situs web saya untuk kueri
tmp
, saya menemukan bahwa situs saya berisi folder lain yang disebutkantmp
dalam direktori berbeda. Saya menyadari bahwa skrip PHP saya sebenarnya sedang menulis file yang diunggah.cagefs/tmp
. ( "Tampilkan File Tersembunyi" harus diaktifkan di cPanel untuk melihat folder ini.)Jadi, mengapa
sys_get_temp_dir
fungsi mengembalikan info yang tidak akurat?Berikut adalah penjelasan dari halaman web PHP.net untuk
sys_get_temp_dir
(yaitu, komentar teratas):Posting SO ini menggali masalah, juga:
sumber
Saya mendapat masalah yang sama dan tidak ada tema yang merupakan kesalahan saya. Periksa di file .htaccess Anda, jika ada, jika "MultiViews" diaktifkan. Saya harus menonaktifkannya.
sumber
Saya memiliki masalah yang sama dan masalah ini bernilai salah dalam htaccess seperti yang disebutkan shamittomar.
Ubah
php_value post_max_size 10MB
kephp_value post_max_size 10M
sumber
Saya kosong
$_FILES
karena setelah<form enctype="multipart/form-data" method="post">
saya tempatkanSeperti kode awal
Saya memutuskan untuk memodifikasi dan
Jadi kesimpulannya adalah bahwa setelah
<form enctype="multipart/form-data" method="post">
harus<input name, type, id
dan tidak boleh<div>
atau tag lainDalam situasi saya, kode yang benar adalah
sumber
Saya juga punya masalah dengan $ _FILES kosong. Daftar periksa di atas tidak menyebutkan MultiViews di .htaccess, httpd.conf atau httpd-vhost.conf.
Jika Anda memiliki MultiViews diatur dalam direktif pilihan untuk direktori Anda yang berisi situs web, $ _FILES akan kosong, meskipun tajuk Panjang Konten jika menunjukkan bahwa file yang saya unggah.
sumber
Jika Anda menggunakan JQuery Mobile
Menggunakan formulir multi-bagian dengan input file tidak didukung oleh Ajax. Dalam hal ini Anda harus menghias formulir induk dengan data-ajax = "false" untuk memastikan formulir dikirimkan dengan benar ke server.
sumber
Lepaskan formulir Anda dari halaman yang Anda gunakan menjadi halaman php sederhana yang hanya memiliki formulir dan kode php, dan ujilah seperti itu.
Bootstrap atau skrip java apa pun dapat membersihkan _FILES []. Itu kasus saya
sumber