zoukankan      html  css  js  c++  java
  • 批量下载(二)

          通过上篇文章测试发现一个问题, 由于以导出excel形式将所有下载的数据汇总到一起,会出现数据量过大时超出了内存的限制。

    解决方法一:

    根据要下载的数据量的大小,手动设置内存大小。说明:php.ini 默认内存为128M
    ini_set('memory_limit', '512M');

    解决方法二:

    将所有要下载的卡号文件以压缩包的方式下载到本地。

    Card.php

    if($action == 'batchDownload') {
        $downloadList = $_POST['downloadList'];
        if(is_array($downloadList)) {
            _debug($downloadList);
            $ret = $Card ->batchDownload($downloadList);
            if(isset($ret['status']) && $ret['status'] == 1) {
                //ok
            } else {
                $msg[] = '批量下载失败: ' . $ret['error'];
            }
        } else {
            $msg[] = '先选择要下载的卡号';
        }
    }

    Card.class.php

    class Card {
         /**
         * 批量下载
         * @param array $download_list
         *     array( [1560392489_2_2_30000.txt] => on
         *               [1560392487_2_2_30000.txt] => on
         *               [1560392486_2_2_30000.txt] => on )
         * @return array(status => int, error => string)
         */
        public function batchDownload($download_list) {
            $ret = array('status' => 0, 'error' => '');
            $copy_flag = true;
            $tar_flag = false;
            $token = genToken();
            $work_dir = '/tmp/' . $token;
            $tar_filename = 'card.tar.gz';
            $tar_filename2 = '/tmp/' . $tar_filename;
            //创建临时目录
            if(mkdir($work_dir)) {
                //拷贝文件并重命名
                foreach ($download_list as $filename => $value) {
                    $file = $this->getDir() . '/'. $filename;
                    $card_arr = explode('_', $filename);
                    $f_type = $card_arr[2];
                    $f_type_name = isset($this ->card_type[$f_type]) ? $this ->card_type[$f_type] : 'unknown';
                    $new_filename = $f_type . '_' . $f_type_name . '_' . $filename;
                    $new_file = $work_dir . '/' . $new_filename;
                    if( ! copy($file, $new_file) ) {
                        $ret = array('status' => 0, 'error' => $filename.'文件复制失败');
                        $copy_flag = false;
                        break;
                    }
                }
                //打包
                if($copy_flag) {
                    $cmd = 'cd /tmp/ && tar -zcf ' . $tar_filename . ' ' . $token . '/*.txt ';
                    _info($cmd);
                    $output = array();
                    $return_var = null;
                    exec($cmd, $output, $return_var);
                    $output_str = implode("
    ", $output);
                    if($return_var === 0) {
                        $tar_flag = true;
                    } else {
                        $error = "执行命令{$cmd}出错,msg:" . $output_str;
                        _error($error);
                        $ret = array('status' => 0, 'error' => '打包失败');
                    }
                }
                //删除临时目录
                if ($handle = opendir($work_dir)) {
                    while (false !== ($file = readdir($handle))) {
                        $file2 = $work_dir . '/' . $file;
                        if(is_file($file2)) {
                            unlink($file2);
                        }
                    }
                }
                rmdir($work_dir);
                //下载
                if($tar_flag) {
                    browserDownloadFile($tar_filename2, 'force-download');
                }
            } else {
                $ret = array('status' => 0, 'error' => '新建目录失败');
            }
            return $ret;
        }
    }
    /**
     * 让客户端去下载一个文件
     */
    function browserDownloadFile($filename, $type = "text", $new_filename='')
    {
        if(empty($new_filename)) {
            $basename = basename($filename);
        } else {
            $basename = $new_filename;
        }
        header('Content-type: application/'. $type);
        header('Content-Disposition: attachment; filename="' . $basename . '"');
        readfile($filename);
        exit();
    }

    结果如下:

    友情提示:若WinRAR解压后的文件出现中文乱码,有两种情况:

    1.WinRAR版本过低,需升级版本

    2.下载好压压缩文件

  • 相关阅读:
    莫队
    NOIP2010_T4_引水入城 bfs+贪心
    拉灯游戏 搜索
    种花小游戏 随机化搜索
    [usaco2003feb]impster
    P1265 公路修建 (prim)
    P3378 【模板】堆
    并查集 模板
    P2661 信息传递
    P1828 香甜的黄油 Sweet Butter (spfa)
  • 原文地址:https://www.cnblogs.com/lonmyblog/p/11018307.html
Copyright © 2011-2022 走看看