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.下载好压压缩文件

  • 相关阅读:
    一个简单的knockout.js 和easyui的绑定
    knockoutjs + easyui.treegrid 可编辑的自定义绑定插件
    Knockout自定义绑定my97datepicker
    去除小数后多余的0
    Windows Azure Web Site (15) 取消Azure Web Site默认的IIS ARR
    Azure ARM (1) UI初探
    Azure Redis Cache (3) 创建和使用P级别的Redis Cache
    Windows Azure HandBook (7) 基于Azure Web App的企业官网改造
    Windows Azure Storage (23) 计算Azure VHD实际使用容量
    Windows Azure Virtual Network (11) 创建VNet-to-VNet的连接
  • 原文地址:https://www.cnblogs.com/lonmyblog/p/11018307.html
Copyright © 2011-2022 走看看