zoukankan      html  css  js  c++  java
  • PHP 远程文件下载的进度条实现

    download.php

     1 <?php 
     2 // 当前文件:download.php
     3 
     4 $action = @$_GET['action'];
     5 
     6 // 自己获取这些信息
     7 $remote_url  = get_remote_file_url();
     8 $file_size   = get_remote_file_size($remote_url);
     9 $tmp_path    = get_tmp_path();
    10 
    11 switch ($action) {
    12     case 'prepare-download':
    13         // 下载缓存文件夹
    14         $download_cache = __DIR__."/download_cache";
    15 
    16         if (!is_dir($download_cache)) {
    17             if (false === mkdir($download_cache)) {
    18                 exit('创建下载缓存文件夹失败,请检查目录权限。');
    19             }
    20         }
    21 
    22         $tmp_path = $download_cache."/update_".time().".zip";
    23 
    24         save_tmp_path(); // 这里保存临时文件地址
    25 
    26         return json(compact('remote_url', 'tmp_path', 'file_size'));
    27 
    28         break;
    29 
    30     case 'start-download':
    31 
    32         // 这里检测下 tmp_path 是否存在
    33 
    34         try {
    35             set_time_limit(0);
    36 
    37             touch($tmp_path);
    38 
    39             // 做些日志处理
    40 
    41             if ($fp = fopen($remote_url, "rb")) {
    42 
    43                 if (!$download_fp = fopen($tmp_path, "wb")) {
    44                     exit;
    45                 }
    46 
    47                 while (!feof($fp)) {
    48 
    49                     if (!file_exists($tmp_path)) {
    50                         // 如果临时文件被删除就取消下载
    51                         fclose($download_fp);
    52 
    53                         exit;
    54                     }
    55 
    56                     fwrite($download_fp, fread($fp, 1024 * 8 ), 1024 * 8);
    57                 }
    58 
    59                 fclose($download_fp);
    60                 fclose($fp);
    61 
    62             } else {
    63                 exit;
    64             }
    65 
    66         } catch (Exception $e) {
    67             Storage::remove($tmp_path);
    68 
    69             exit('发生错误:'.$e->getMessage());
    70         }
    71 
    72         return json(compact('tmp_path'));
    73 
    74         break;
    75 
    76     case 'get-file-size':
    77 
    78         // 这里检测下 tmp_path 是否存在
    79 
    80         if (file_exists($tmp_path)) {
    81             // 返回 JSON 格式的响应
    82             return json(['size' => filesize($tmp_path)]);
    83         }
    84 
    85         break;
    86 
    87     default:
    88         # code...
    89         break;
    90 }

    js

     1 // 咋触发这个函数我就不举例了
     2 function downloadFile() {
     3     var file_size = 0;
     4     var progress  = 0;
     5 
     6     console.log("Prepared to download");
     7 
     8     $.ajax({
     9         url: './download.php?action=prepare-download',
    10         type: 'GET',
    11         dataType: 'json',
    12         beforeSend: function() {
    13             $('#update-button').html('<i class="fa fa-spinner fa-spin"></i> 正在准备').prop('disabled', 'disabled');
    14         },
    15     })
    16     .done(function(json) {
    17         console.log(json);
    18 
    19         file_size = json.file_size;
    20 
    21         $('#file-size').html(file_size);
    22 
    23         // 显示进度条
    24 
    25         console.log("started downloading");
    26         $.ajax({
    27             url: './download.php?action=start-download',
    28             type: 'POST',
    29             dataType: 'json'
    30         })
    31         .done(function(json) {
    32             // set progress to 100 when got the response
    33             progress = 100;
    34 
    35             console.log("Downloading finished");
    36             console.log(json);
    37         })
    38         .fail(showAjaxError);
    39 
    40         var interval_id = window.setInterval(function() {
    41 
    42             $('#imported-progress').html(progress);
    43             $('.progress-bar').css('width', progress+'%').attr('aria-valuenow', progress);
    44 
    45             if (progress == 100) {
    46                 clearInterval(interval_id);
    47               
    48                 // 到此远程文件下载完成,继续其他逻辑
    49             } else {
    50                 $.ajax({
    51                     url: './download.php?action=get-file-size',
    52                     type: 'GET'
    53                 })
    54                 .done(function(json) {
    55                     progress = (json.size / file_size * 100).toFixed(2);
    56                   
    57                     updateProgress(progress);
    58 
    59                     console.log("Progress: "+progress);
    60                 })
    61                 .fail(showAjaxError);
    62             }
    63 
    64         }, 300);
    65 
    66     })
    67     .fail(showAjaxError);
    68 
    69 }
  • 相关阅读:
    Unity中Avatar换装实现
    Unity 导出NavMesh (可行走区域判定) 数据给服务器使用
    Unity发布安卓Splash Image适应手机、平板
    什么是展uv
    三合一收款二维码
    牛顿的八字养生经
    牛顿
    [家里蹲大学数学杂志]第412期积分与极限
    Newton's Dark Secrets《牛顿探索》
    英国《物理世界》杂志评选出世界十大物理学家
  • 原文地址:https://www.cnblogs.com/saonian/p/9204578.html
Copyright © 2011-2022 走看看