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:

配置项说明
session.upload_progress.enabled是否启用上传进度报告(默认开启) 1为开启,0为关闭
session.upload_progress.cleanup是否在上传完成后及时删除进度数据(默认开启, 推荐开启)
session.upload_progress.prefix[=upload_progress_]进度数据将存储在_SESSION[session.upload_progress.prefix . _POST[session.upload_progress.name]]
session.upload_progress.name[=PHP_SESSION_UPLOAD_PROGRESS]如果_POST[session.upload_progress.name]没有被设置, 则不会报告进度.
session.upload_progress.freq[=1%]更新进度的频率(已经处理的字节数), 也支持百分比表示’%’.
session.upload_progress.min_freq[=1.0]更新进度的时间间隔(秒级)

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(
    //请求时间
     "start_time" => 1234567890,
     // 上传文件总大小
     "content_length" => 57343257,
     //已经处理的大小
     "bytes_processed" => 453489,
     //当所有上传处理完成后为TRUE,未完成为false
     "done" => false,
     "files" => array(
      0 => array(
        //表单中上传框的名字
       "field_name" => "file1",
       //上传文件的名称
       "name" => "test1.avi",
       //缓存文件,上传的文件即保存在这里
       "tmp_name" => "/tmp/phpxxxxxx",
       //文件上传的错误信息
       "error" => 0,
       //是否上传完成,当这个文件处理完成后会变成TRUE
       "done" => true, 
       //这个文件开始处理时间
       "start_time" => 1234567890,
       //这个文件已经处理的大小
       "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);    //当上传进度小于100%时,显示上传百分比
        }else{
            $('#progress .label').html('完成!'); //当上传进度等于100%时,显示上传完成
        }
    }, 'html');
}
$('#upload-form').submit(function(){
    $('#progress').show();
    setTimeout('fetch_progress()', 100);//每0.1秒执行一次fetch_progress(),查询文件上传进度
});
</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']}");     //将缓存文件移动到指定位置
}
?>

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!


Meneruskan pembelajaran
||
<?php /* 开启session。请注意在session_start()之前,请不要有想浏览器输出内容的动作,否则可能引起错误。 */ session_start(); //ini_get()获取php.ini中环境变量的值 $i = ini_get('session.upload_progress.name'); //ajax中我们使用的是get方法,变量名称为ini文件中定义的前缀 拼接 传过来的参数 $key = ini_get("session.upload_progress.prefix") . $_GET[$i]; //判断 SESSION 中是否有上传文件的信息 if (!empty($_SESSION[$key])) { //已上传大小 $current = $_SESSION[$key]["bytes_processed"]; //文件总大小 $total = $_SESSION[$key]["content_length"]; //向 ajax 返回当前的上传进度百分比。 echo $current < $total ? ceil($current / $total * 100) : 100; }else{ echo 100; } ?>
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!