Pemprosesan kemajuan muat naik fail PHP
Apabila fail terlalu besar atau status rangkaian pengguna adalah sederhana, proses muat naik biasanya mengambil sedikit masa Jika pengguna dibiarkan menunggu dengan skrin kosong pada masa ini, saya percaya kebanyakan pengguna akan menutupnya aplikasi, jadi seseorang harus memantau kemajuan muat naik Keperluan untuk melaporkan kepada pengguna dalam masa nyata telah diletakkan di atas meja oleh Product Wang. Gesaan kemajuan muat naik yang berkualiti tinggi akan menjadikan aplikasi anda kelihatan menarik dengan serta-merta.
Sebelum PHP 5.4, anda sentiasa perlu memasang sambungan tambahan untuk memantau kemajuan muat naik fail. Bermula dari 5.4, ciri baharu session.upload_progress diperkenalkan Kami hanya perlu mendayakan konfigurasi dalam php.ini untuk memantau kemajuan muat naik fail melalui sesi. dalam php.ini.
Nota: Untuk mempelajari bab ini, anda perlu mempunyai pengetahuan asas tentang session dan javascript serta ajax.
Kita perlu mengkonfigurasi, memberi perhatian untuk menyemak dan mengubah suai fail php.ini:
配置項(xiàng) | 說(shuō)明 |
---|---|
session.upload_progress.enabled | 是否啟用上傳進(jìn)度報(bào)告(默認(rèn)開(kāi)啟) 1為開(kāi)啟,0為關(guān)閉 |
session.upload_progress.cleanup | 是否在上傳完成后及時(shí)刪除進(jìn)度數(shù)據(jù)(默認(rèn)開(kāi)啟, 推薦開(kāi)啟) |
session.upload_progress.prefix[=upload_progress_] | 進(jìn)度數(shù)據(jù)將存儲(chǔ)在_SESSION[session.upload_progress.prefix . _POST[session.upload_progress.name]] |
session.upload_progress.name[=PHP_SESSION_UPLOAD_PROGRESS] | 如果_POST[session.upload_progress.name]沒(méi)有被設(shè)置, 則不會(huì)報(bào)告進(jìn)度. |
session.upload_progress.freq[=1%] | 更新進(jìn)度的頻率(已經(jīng)處理的字節(jié)數(shù)), 也支持百分比表示’%’. |
session.upload_progress.min_freq[=1.0] | 更新進(jìn)度的時(shí)間間隔(秒級(jí)) |
Dengan konfigurasi didayakan, kami boleh merekodkan kemajuan muat naik fail yang lengkap melalui sesi. Dalam sesi, tatasusunan dengan keputusan berikut akan muncul:
$_SESSION["upload_progress_test"] = array( //請(qǐng)求時(shí)間 "start_time" => 1234567890, // 上傳文件總大小 "content_length" => 57343257, //已經(jīng)處理的大小 "bytes_processed" => 453489, //當(dāng)所有上傳處理完成后為TRUE,未完成為false "done" => false, "files" => array( 0 => array( //表單中上傳框的名字 "field_name" => "file1", //上傳文件的名稱 "name" => "test1.avi", //緩存文件,上傳的文件即保存在這里 "tmp_name" => "/tmp/phpxxxxxx", //文件上傳的錯(cuò)誤信息 "error" => 0, //是否上傳完成,當(dāng)這個(gè)文件處理完成后會(huì)變成TRUE "done" => true, //這個(gè)文件開(kāi)始處理時(shí)間 "start_time" => 1234567890, //這個(gè)文件已經(jīng)處理的大小 "bytes_processed" => 57343250, ), 1 => array( "field_name" => "file2", "name" => "test2.avi", "tmp_name" => NULL, "error" => 0, "done" => false, "start_time" => 1234567899, "bytes_processed" => 54554, ), ) );
Tatasusunan ini merekodkan kemajuan muat naik fail secara terperinci dan status fail yang telah diproses adalah benar. Seterusnya, kami menggunakan contoh AJAX jQuery untuk mempelajari proses kemajuan muat naik fail.
Pertama, dalam borang, anda perlu menambah teg input dengan type=hidden, dan nilai teg adalah tersuai (adalah disyorkan untuk menggunakan nilai yang bermakna, kerana nilai ini akan digunakan di latar belakang)
<form id="upload-form" action="upload.php" method="POST" enctype="multipart/form-data" style="margin:15px 0" target="hidden_iframe"> <input type="hidden" name="<?php echo ini_get("session.upload_progress.name"); ?>" value="test" /> <p><input type="file" name="file1" /></p> <p><input type="submit" value="Upload" /></p> </form> <div id="progress" class="progress" style="margin-bottom:15px;display:none;"> <div class="label">0%</div> </div>
Di sini, div dengan ID kemajuan ditambahkan sebagai bekas untuk memaparkan kemajuan muat naik. Kami menggunakan setTimeout() js untuk melaksanakan ajax dengan kerap untuk mendapatkan kemajuan muat naik fail, dan fail latar belakang mengembalikan peratusan kemajuan muat naik fail.
<script src="../jquery/1.8.2/jquery.min.js"></script> <script type="text/javascript"> function fetch_progress(){ $.get('progress.php',{ '<?php echo ini_get("session.upload_progress.name"); ?>' : 'test'}, function(data){ var progress = parseInt(data); $('#progress .label').html(progress + '%'); if(progress < 100){ setTimeout('fetch_progress()', 100); //當(dāng)上傳進(jìn)度小于100%時(shí),顯示上傳百分比 }else{ $('#progress .label').html('完成!'); //當(dāng)上傳進(jìn)度等于100%時(shí),顯示上傳完成 } }, 'html'); } $('#upload-form').submit(function(){ $('#progress').show(); setTimeout('fetch_progress()', 100);//每0.1秒執(zhí)行一次fetch_progress(),查詢文件上傳進(jìn)度 }); </script>
Kod di atas mengembalikan kemajuan muat naik fail setiap 0.1 saat melalui ajax JQ. Dan paparkan peratusan kemajuan dalam teg div.
Kod latar belakang perlu dibahagikan kepada dua bahagian upload.php mengendalikan muat naik fail. progress.php mendapat kemajuan muat naik dalam sesi dan mengembalikan peratusan kemajuan.
Saya tidak akan menerangkan butiran tentang muat naik fail di sini. Sila rujuk perkara di atas untuk langkah-langkah terperinci muat naik.php:
<?php if(is_uploaded_file($_FILES['file1']['tmp_name'])){ //判斷是否是上傳文件 //unlink($_FILES['file1']['tmp_name']); move_uploaded_file($_FILES['file1']['tmp_name'], "./{$_FILES['file1']['name']}"); //將緩存文件移動(dòng)到指定位置 } ?>
Terutamanya fokus pada kemajuan.php:
rreee.Di sini, kemajuan fail Kod telah selesai Dengan bahagian hadapan, kami boleh mencipta fungsi muat naik fail yang menarik!