php实现多文件压缩,并返回给浏览器下载

public function downloadFile()
    {
        $params = $this->request->param();
        $zip = new \ZipArchive();
        //如果请求体没有files或者为空则返回错误
        if (!isset($params["files"]) || $params["files"] == null) {
            return json([
                        "code" => 0,
                        "msg" => "error",
                        "data" => "files不能为空"
                    ]);
        }
        try {
            //创建一个压缩文件,以当前毫秒数为名称,注意释放这个zip流
            $time = time() . ".zip";
            $res = $zip->open($time, \ZipArchive::CREATE);
            if ($res === false) {
                return json([
                        "code" => 0,
                        "msg" => "error",
                        "data" => "创建压缩包失败"
                    ]);
            }
            //循环添加文件
            foreach ($params["files"] as $file) {
                $urlArr = explode("/", $file["file_url"]);
                $sliceUrl = array_slice($urlArr, -2); //获取数组最后两个值
                $url = implode("/", $sliceUrl); //在将数组最后的两个值变成一个字符串
                $file["file_url"] = "../public/upload/default/" . $url;
                if (!file_exists($file["file_url"])) {
                    return json([
                        "code" => 0,
                        "msg" => "error",
                        "data" => "下载失败,原因:" . $file["file_name"] . "文件不存在"
                    ]);
                }
                $zip->addFile($file["file_url"], $file["file_name"]);
            }
            $zip->close();
            ob_clean();
            // 设置响应头,告诉浏览器返回的是一个流
            header('Access-Control-Allow-Origin:*');
            header('Content-Length: ' . filesize($time));
            header("Cache-Control: public");
            header("Content-Description: File Transfer");
            header("Content-Type: application/zip");
            header("Content-Transfer-Encoding: binary");
            header("Content-Disposition: attachment; filename=\"" . basename($time) . "\"");

            readfile($time);
            //删除服务端生成的zip文件
            ignore_user_abort(true);
            unlink($time);
            exit;
        } catch (Exception $exception) {
            $zip->close();
            Log::record($exception->getLine(), "----------line------------");
            Log::record($exception->getMessage(), "----------error------------");
            return json([
                        "code" => 0,
                        "msg" => "error",
                        "data" => "服务器异常,请稍后再试!!!"
                    ]);
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值