php laravel多文件压缩

控制器代码

下载控制器:DownloadController

<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\ConfirmationUseModel;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use ZipArchive;


class DownloadController extends Controller
{
    public function download(Request $request){
        $loadname = $request->get('apply_sn',date('Y-m-d'));//获取编号为了作为下载的文件名称 默认日期作为名称
        $id = $request->get('id',0);
        if($id){
        	//从数据库查找出文件列表
            $file_url = ConfirmationUseModel::query()->where(['p_a_id'=>$id])->value('file_url');
            if($file_url){
                $file_url_ar = json_decode($file_url,true);
                if($file_url_ar){
                	//如果只有一个文件
                    if(count($file_url_ar)==1){
                        $cv = explode('uploads',$file_url_ar[0]['url']);
                        Log::info(print_r($cv,true));
                        $file_name = './uploads'.$cv[1];     // 下载文件名
                        // 检查文件是否存在
                        if (!file_exists($file_name)) {
                            Log::info('111');
                            header('HTTP/1.1 404 NOT FOUND');
                        } else {
                            // 以只读和二进制模式打开文件
                            $file = fopen($file_name, "rb");
                            // 告诉浏览器这是一个文件流格式的文件
                            Header("Content-type: application/octet-stream");
                            // 请求范围的度量单位
                            Header("Accept-Ranges: bytes");
                            // Content-Length是指定包含于请求或响应中数据的字节长度
                            Header("Accept-Length: " . filesize($file_name));
                            // 用来告诉浏览器,文件是可以当做附件被下载,下载后的文件名称为$file_name该变量的值。
                            Header("Content-Disposition: attachment; filename=" .$loadname.'-'.$file_url_ar[0]['name']);
                            @readfile($file_name);
                            fclose($file);
                            exit ();
                        }
                        exit();
                    }
                    $img = array();
                    foreach ($file_url_ar as $k=>$item){
                        $img[$k]['url'] = $item['url'];
                        $name = explode('.',$item['name']);
                        $img[$k]['name'] = $name[0];
                    }
                    //多个文件的话,压缩下载。 第一个参数是文件数组 第二个是要生成的文件名
                    $this->DownloadFile($img,$loadname);
                }
            }

        }
        echo "未找到要下载的文件";
    }
    /**
     * 下载文件
     * @param $img
     * @return string
     */
    public function DownloadFile($img,$loadname='down')
    {
        $items = [];
        $names = [];
        if($img)
        {
            //用于前端跳转zip链接拼接
            $path_redirect = '/zip/'.date('Ymd');
            //临时文件存储地址
            $path      = '/tmp'.$path_redirect;
            if(!is_dir($path))
            {
                mkdir($path, 0777,true);
            }
            foreach ($img as $key => $value) {
                $fileContent = '';
                $fileContent = $this->CurlDownload($value['url']);
                if( $fileContent )
                {
                    $__tmp = $this->SaveFile( $value['url'] , $path , $fileContent );
                    $items[] = $__tmp[0];
                    $names[] = $value['name'].'_'.($key+1).'.'.$__tmp[1];
                }
            }
            if( $items )
            {
                $zip = new ZipArchive();
                $filename = time().'download.zip';
                $zipname = $path.'/'.$filename;
                if (!file_exists($zipname)) {
                    $res = $zip->open($zipname, ZipArchive::CREATE | ZipArchive::OVERWRITE);
                    if ($res) {
                        foreach ($items as $k => $v) {
                            $value = explode("/", $v);
                            $end  = end($value);
                            $zip->addFile($v, $end);
                            $zip->renameName($end, $names[$k]);
                        }
                        $zip->close();
                    } else {
                        return '';
                    }
                    //通过前端js跳转zip地址下载,让不使用php代码下载zip文件
                    //if (file_exists($zipname)) {
                    //拼接附件地址
                    //$redirect = 域名.$path_redirect.'/'.$filename;
                    //return $redirect;
                    //header("Location:".$redirect);
                    //}
                    //直接写文件的方式下载到客户端
                    if (file_exists($zipname)) {
                        header("Cache-Control: public");
                        header("Content-Description: File Transfer");
                        header('Content-disposition: attachment; filename='.$loadname.'.zip'); //文件名
                        header("Content-Type: application/zip"); //zip格式的
                        header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件
                        header('Content-Length: ' . filesize($zipname)); //告诉浏览器,文件大小
                        @readfile($zipname);
                    }
                    //删除临时文件
                    @unlink($zipname);
                }
            }
            return '';
        }
    }
    /**
     * curl获取链接内容
     * @param $url
     * @return mixed|string
     */
    public function CurlDownload($url) {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        $errno   = curl_errno($ch);
        $error   = curl_error($ch);
        $res=curl_exec($ch);
        curl_close($ch);
        if($errno>0){
            return '';
        }
        return $res;
    }
    /**
     * 保存临时文件
     * @param $url
     * @param $dir
     * @param $content
     * @return array
     */
    public function SaveFile( $url ,$dir , $content)
    {
        $fname   = basename($url); //返回路径中的文件名部分
        $str_name  = pathinfo($fname); //以数组的形式返回文件路径的信息
        $extname  = strtolower($str_name['extension']); //把扩展名转换成小写
        $path    = $dir.'/'.md5($url).$extname;
        $fp     = fopen( $path ,'w+' );
        fwrite( $fp , $content );
        fclose($fp);
        return array( $path , $extname) ;
    }
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值