Traitement de la progression du téléchargement du fichier PHP

Lorsque le fichier est trop volumineux ou que l'état du réseau de l'utilisateur est moyen, le processus de téléchargement prend généralement un certain temps. Si l'utilisateur attend avec un écran vide à ce moment-là, je pense que la plupart des utilisateurs fermeront simplement le fichier. application, il faut donc surveiller la progression du téléchargement. La nécessité de rendre compte aux utilisateurs en temps réel a été mise sur la table par Product Wang. Une invite de progression du téléchargement de haute qualité fera instantanément ressembler votre candidature.

Avant PHP 5.4, vous deviez toujours installer des extensions supplémentaires pour surveiller la progression du téléchargement des fichiers. À partir de la version 5.4, la nouvelle fonctionnalité session.upload_progress est introduite. Il suffit d'activer la configuration dans php.ini pour surveiller la progression du téléchargement du fichier tout au long de la session. dans php.ini.

Remarque : Pour apprendre ce chapitre, vous devez avoir une connaissance de base de la session, du javascript et de l'ajax.

Nous devons configurer, faites attention à vérifier et modifier le fichier 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]更新进度的时间间隔(秒级)

Avec la configuration activée, nous pouvons enregistrer la progression complète du téléchargement de fichiers tout au long de la session. Dans la session, un tableau avec les résultats suivants apparaîtra :

$_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,
      ),
     )
    );

Ce tableau enregistre la progression du téléchargement des fichiers en détail et l'état des fichiers qui ont été traités est vrai. Ensuite, nous utilisons un exemple jQuery AJAX pour apprendre le processus de progression du téléchargement de fichiers.

Tout d'abord, dans le formulaire, vous devez ajouter une balise d'entrée avec type=hidden, et la valeur de la balise est personnalisée (il est recommandé d'utiliser une valeur significative, car cette valeur sera utilisée en arrière-plan)

<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>

Ici, un div avec l'ID de progression est ajouté en tant que conteneur pour afficher la progression du téléchargement. Nous utilisons setTimeout() de js pour exécuter ajax régulièrement afin d'obtenir la progression du téléchargement du fichier, et le fichier d'arrière-plan renvoie le pourcentage de progression du téléchargement du fichier.

<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>

Le code ci-dessus renvoie la progression du téléchargement du fichier toutes les 0,1 seconde via l'ajax de JQ. Et affichez le pourcentage de progression dans la balise div.

Le code d'arrière-plan doit être divisé en deux parties. upload.php gère le téléchargement de fichiers. progress.php obtient la progression du téléchargement dans la session et renvoie le pourcentage de progression.

Je n'entrerai pas dans les détails sur le téléchargement de fichiers ici. Veuillez vous référer à ce qui précède pour les étapes détaillées upload.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']}");     //将缓存文件移动到指定位置
}
?>

Concentrez-vous principalement sur progress.php :

<?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;                                                       
}
?>
<. 🎜>Ici, progression du fichier Le code est terminé. Avec le front-end, nous pouvons créer une fonction sympa de téléchargement de fichiers !


Formation continue
||
<?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; } ?>
soumettreRéinitialiser le code
  • Recommandations de cours
  • Téléchargement du didacticiel