PHP 文件压缩和下载相关类的封装

本文介绍了一种使用PHP实现的文件打包与下载的方法。通过ZipArchive类解压和重新打包文件,并修改特定文件内容,最终提供给用户下载。涉及文件操作、字符串处理及HTTP响应头设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 * 打包下载文件
 * @param Request $request
 * @param $id
 *
 */
public function upload_file(Request $request, $id)
{
    $res = $this->obj->where(['id' => $id])->first();
    $mo = ModularModel::find($res->modular_id);
    $zip = new \ZipArchive();
    if ($zip->open($mo->file_html) === TRUE) {
        dir_del(public_path('temp/'));
        sleep(1);
        mkdir('temp');
        //解压缩到temp文件
        $zip->extractTo('temp');
        $content = $zip->getFromName('app.js');//获取压缩包文件的内容
        $pos = strpos($content, 'globalData:', 1);
        //dd($pos);
        $new_content = substr($content, 0, $pos);
        $url_host = 'http://' . $_SERVER['HTTP_HOST'];
        //替换文件中的部分数据
        $new_content .= "globalData:{ modular: '" . $mo->name . "',url_host:'" . $url_host . "',bid:'" . $res->id . "'}})";
        //file_put_contents("./temp/app.js", $new_content, FILE_APPEND);
        file_put_contents("./temp/app.js", $new_content);

        $this->add_zip('new_temp/1.zip','temp');

        $filePath = public_path('new_temp/');//此处给出你下载的文件在服务器的什么地方
        $fileName = '1.zip';
        //此处给出你下载的文件名
        $file = fopen($filePath . $fileName, "r"); //   打开文件
        //输入文件标签
        Header("Content-type:application/octet-stream ");
        Header("Accept-Ranges:bytes ");
        Header("Accept-Length:   " . filesize($filePath . $fileName));
        Header("Content-Disposition:   attachment;   filename= " . $fileName);

        //   输出文件内容
        echo fread($file, filesize($filePath . $fileName));
        fclose($file);
        unlink($filePath.'1.zip');
        //移动文件
         $file='old_temp/1.zip'; //旧目录
         $newFile='new_temp/1.zip'; //新目录
         $this->move_zip_part($file,$newFile);
        exit;
    }else{
        echo '模块文件不存在,请检查';
    }

}

public function addFileToZip($path,$zip){
    $handler=opendir($path); //打开当前文件夹由$path指定。
    while(($filename=readdir($handler))!==false){
        if($filename != "." && $filename != ".."){//文件夹文件名字为'.'‘..’,不要对他们进行操作
            if(is_dir($path."/".$filename)){// 如果读取的某个对象是文件夹,则递归
               $this->addFileToZip($path."/".$filename, $zip);
            }else{ //将文件加入zip对象
                $zip->addFile($path."/".$filename);
            }
        }
    }
    @closedir($path);
}
//生成一个压缩包

public function add_zip($file_zip,$path)
{
    $zip=new \ZipArchive();
    if($zip->open($file_zip, \ZipArchive::OVERWRITE)=== TRUE){
        if(is_dir($path)){  //给出文件夹,打包文件夹
            addFileToZip($path, $zip);
        }else if(is_array($path)){  //以数组形式给出文件路径
            foreach($path as $file){
                $zip->addFile($file);
            }
        }else{      //只给出一个文件
            $zip->addFile($path);
        }
        $zip->close(); //关闭处理的zip文件
    }
}

/**
 * 移动zip文件
 * @param $file 需要删除的文件
 * @param $newFile 需要移动的文件
 *
 */
public function move_zip_part($file,$newFile)
{
    dir_del(public_path('new_temp/'));
    sleep(1);
    mkdir('new_temp');
    copy($file,$newFile); //拷贝到新目录

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值