Yii2.0 – 文件打包接口

这篇文章我们通过Yii2.0框架来完成文件打包下载功能,相信这个功能会在很多的地方有所使用。

Yii 2.0

开篇我们简单说下Yii框架,这个框架以MVC框架为基础,主要我们知道Controller、Model和View在哪里写就可以,我这里以basic为基础,同样的这篇文章不处理其他事情,比如路由什么的,只关注多文件打包zip以及下载功能。
比如这样的URL:http://127.0.0.1/basic/web/index.php?r=my/index
表示MyController的index方法
Controller文件写在controllers中
MyController.php

request->isPost) {
            $user_name = Yii::$app->request->post("name", "");
            echo $user_name;
        }
    }
}

这里我们新建一个action来作为多个文件打包下载的接口

/**
 * 多文件打包下载
 * @param file_list 表示下载文件的列表,数据格式可以多种,这里以json为例
 * @example file_list [1.txt, 2.txt, 3.txt]
 */
public function actionMutifiledown($file_list) {
    // TODO
    var_dump(json_decode($file_list, true));
}


现在我们的web目录下存在1.doc、2.doc、3.doc、4.doc几个文件,我们怎么将他们打包下载呢?

打包Zip

我们使用PHP的ZipArchive扩展,直接上代码

/**
 * 多文件打包下载
 * @param file_list 表示下载文件的列表,数据格式可以多种,这里以json为例
 * @example file_list [1.txt, 2.txt, 3.txt]
 */
public function actionMutifiledown($file_list) {
    // 现在存在1.doc;2.doc;3.doc;4.doc几个文件
    $zip = new \ZipArchive;    // 存在Zip扩展
    if ($zip->open("1.zip", \ZIPARCHIVE::CREATE)!==TRUE) {
        // 创建1.zip 确保存在权限
        exit();
    }
    $zip->addFile("1.doc");
    $zip->addFile("2.doc");
    $zip->addFile("3.doc");
    $zip->addFile("4.doc");
    $zip->close();
    // 这样我们就打包好了
}

Zip下载

我们知道已经生成了zip文件,下面直接下载到本地,代码如下:

/**
 * 多文件打包下载
 * @param file_list 表示下载文件的列表,数据格式可以多种,这里以json为例
 * @example file_list [1.txt, 2.txt, 3.txt]
 */
public function actionMutifiledown($file_list) {
    // 现在存在1.doc;2.doc;3.doc;4.doc几个文件
    $zip = new \ZipArchive;    // 存在Zip扩展
    if ($zip->open("1.zip", \ZIPARCHIVE::CREATE)!==TRUE) {
        // 创建1.zip 确保存在权限
        exit();
    }
    $zip->addFile("1.doc");
    $zip->addFile("2.doc");
    $zip->addFile("3.doc");
    $zip->addFile("4.doc");
    $zip->close();
    // 这样我们就打包好了
    ob_start();
    $filename = "1.zip";
    header("Content-type:application/octet-stream"); 
    header("Accept-Ranges:bytes");
    header("Content-Disposition:attachment;filename=1.zip");
    $size = readfile($filename);
    header("Accept-Length:" . $size);
}

完善接口

我们上面只是完成了功能,这里还有一些内容需要完善。
接口:http://127.0.0.1/basic/web/index.php?r=my/mutifiledown&file_list=[“1.doc”,”2.doc”,”3.doc”]

/**
 * 多文件打包下载
 * @param file_list 表示下载文件的列表,数据格式可以多种,这里以json为例
 * @example file_list [1.txt, 2.txt, 3.txt]
 * @param $ext 文件可打包扩展名,默认doc
 */
public function actionMutifiledown($file_list, $ext = "doc") {
    //
    $file_arr = json_decode($file_list, true);
    if (!empty($file_arr)) {
        $zipComp = new \ZipArchive;    // Zip扩展
        $zipName = strtotime(date("Y-m-d H:i:s")) . ceil(rand() % 100) . "zip";
        if ($zipComp->open($zipName, \ZIPARCHIVE::CREATE) !== TRUE) {
            exit();
        }
        foreach ($file_arr as $file) {
            $fileArr = explode(".", $file);
            $fileExt = $fileArr[count($fileArr) - 1];
            if ($fileExt == $ext) {
                if (file_exists($file)) {
                    $zipComp->addFile($file);
                }
            }
        }
        $zipComp->close();
        // 开始下载
        if (file_exists($zipName)) {
            ob_start();
            $download_filename = date("YmdHis") . "_archive.zip";
            header("Content-type:application/octet-stream"); 
            header("Accept-Ranges:bytes");
            header("Content-Disposition:attachment;filename=" . $download_filename);
            $size = readfile($zipName);
            header("Accept-Length:" . $size);
        }
    }
}

欢迎留言

avatar
  Subscribe  
Notify of