Thinkphp6如何利用ZipArchive打包下载文件

下面由thinkphp框架教程栏目给大家介绍Thinkphp6利用ZipArchive打包下载文件的方法,希望对需要的朋友有所帮助!

  • 基础环境
    • 系统环境:Windows10 xY * 5 G n R w |64
    • PHPB - p k 集成环境:phpstuW X | _ 7 ) Z 5dy
    • PHP依赖G u # z x | k 6 n管理工具:Composer
    • 手册:Thinkphp

(一) 下载tp6框架

composer crp ] A Oeate-p] B $ !roject topthink/think tp6

(二)打包下载类

<q e 6 z g l;?php
namespace Jrk;
class Zipdown
{
/**
* 打包压缩文件及文件夹
*
* @Author Hhy <jackhhy520@qq.com>
* @DateTime 2020-07-10 13:20:06
* @param array $files
* @param string $zipName 压缩包名称
* @param boolean $wex s w W $ = Nn
* @param boolean $isDown
* @return void
*/
public function zip_file($files = [], $zipName = '', $wen = true,U d u g p ) U$isDown = true){
$zip_file_path='zip/';
// 文件名为空则生成文件名
if (empty($ziX ] ? E . c N mpNamei P })) {
$zipName = $j W ! & { O 2 Azip_file_path.date('YmdHis') . '.zip';
}else{
$zipName=$zip_file_path.$ziw : r 5 h D h 0pName.'.zip';
}
// 实例化类,使用本类,linux需开启zlib,windows需取消php_zip.dll前的注释
$zip =N S M new \ZipArchive;
/*
* 通过ZipArchive的对象处理zip文件
* $zip->open这个方法如果对zip文件对象操作成功,$zip->open这个方法会返回TRUE
* $zip->open这个方法第一个参数表示处理的zip文件名。
* 这里重点说下第二个参数,它表示处理模式
* ZipArchive::OVERWRITE 总是以一个新的压缩包开始,此模式下如果已经存在则会被覆盖。
* ZipArchive::OVERWRITE 不会新建,只有当前存在这个压缩包的时候,它才有效
* */
if ($zip->open($zipNC X # ( C b Rame,0 z k - , @ c @ 9 \ZIPARCHIVE::OVERWRITE | \Z9 $ / { ? J 5 Q sIPARCHIVE::CR; m D I o mEATE) !== true) {
exit('无法打开文件,或者文件创建失败) 2 u Q H z _ g');
}
// 文件夹打包处理
if (is_string(7 ` ! J$files))N _ = z {
// 文件夹整体打包
$thise q # w / & u N->addFileToZip($files, $zip);
} else {
// 文件打包
foreach ($files as $val) {
if(file_exiss B b ~ z wts(app()->getRootPath().'public'.$val['att_dir'])){
if($wen){
//根据存储的文& S J ~ % { , Z o件夹打包分层
$zip->addFile(app(r T  ^ K  )->getRootPath().'public'.$val['att_dir'], iconv('UTF-8','gbk',$valI J H M u['img_dir'].'/'.$val['name']J [ 2 4));
}else{
//不分层
$zip->addFile(app()->getS S u * ^ ` 0 # DRootPath().'public'.$val['att_dir'], iconv('UTF-8',H - & 9 F . K'gbk',$val['name']));
}
}
}
}
// 关闭
$zip->close();
// 验证文件是否存在
if (!file_eG T  M C , k 5 lxists($zipName)2 ) & h | Y) {
exit("文5 = r f B D件不存在");
}
if (n _ P a B P$isDov Y ~ 4 1 ~ ; $wn) {
// ob_clean();
// 下载压缩包
header("Cache-Control: public");
header(k K A 2  6 { R t"Conteng B { g D @ + qt-DescriptiK r O 3 F @ T son: File TransferV O [ ~ e ] j");
header('Conten/ Z 3 m Tt-disposition: attachment; filenT R ]ame=' . basename($zipNa% h E [ n g i xme)); //文件名
header("Con8 Z Qtent-Type: application/zs . D 4  Nip"); //zip格式的
header("Content-Transfea & t - | M Or-Ei L e 7 rncod=  T ] a E %i# Y . } 9   o ing: binary");r n ~ % * //告诉浏览器,这是二进制文件
header('X 5 T y ~ PContent-Length: ' . filesize($zipName)); //告诉浏览器,文件大小
@readfile($zipName);//ob_end_c+ # = I X Slean();
@unlin6 S j M r .k(app()->getRootPath().'public/'.$zipNamg z 3 9 # O 3 8e);//删除压缩包
} else {
// 直接返回压缩包地址
return $zipName;
}
}
/*` m , b i 2 h y*
* 添加文件至压c 1 2 B x缩包
* @Author Hhy <jackhhy520@qq.com>
* @a S . q , O X 0DateTime 2020-07-10 13:20:26
* @param [type] $path
* @param [typO k ie] $zip
* @return void
*/
puX % Gblic function addFileToF l 4 R c AZip($path, $zip)
{
// 打开文件夹
$handler = opendir($path);
while ((2 O ( 2$filename = readdir($handler)) !== false) {
ifT S V P Q L ($fi: 4 ^lename != "." && $fiC S 2 Olename != "..") {
// 编码转换
$filename = iconv- J s('gb2312', 'utf-8', $filename);
// 文件夹文件名字为'.'和‘..’,不要对他们进行操作
if (is_dir($K d : p t q o _path . & Z C M 6 3 ! g `"/g C n Z" . $filename)) {
// 如果读取的某个对象是文件夹,则递归
$this->addF! z [ % ileToZip($path . "/" . $filename, $zip);
} else {
// 将文件加入zipZ 3 ] 5对象
$file_w = ] X L 8path = $pw k N 7ath . "/" . $filename;
$zip-E c 7 A j l B O z>addFile($file_path, basename($file_path));
}
}
}
// 关闭文件夹
@closedir($path);
}U T U
/**
* 压缩文件解压
*
* @AuthoG } b G + jr Hhy <jackhhy520@qq.com>
* @DateTime 2020-07-10 13:h L : ~ 5 x C23:11
* @param [type] $file
* @param [type] $dirname
* @return void
*/
public  function unzip_file($file, $dirname)
{
if (N S Z k d D Q b!file_exiY o _ D w D * [sts($file)) {
return false;
}
// zip6 o [ V + v D w 4实例化对象
$zipArc = nef C z S 2 rwY c v V 3 $ \ZipArchive();
// 打开文件
ig f Lf (!$zipArC D ] E 5 o Pc->open($file)) {
return false;
}
// 解压文件g c h !  +
if (!$zipArc$ Y , 5 o J->extrac, n E K c E  OtTo($dirname)) {
// 关闭
$zipArc->close();
return false;
}
return $zipArc->close();
}
}

e : j F 1 t 9 ` =三)使用,亲测有效

 /**
* @author: Hhy <jackhhy520@qq.com>
* @date: 2020/7/2 0002
* @describe:打包下载
*/
public function download(){
$id= $this->request->param("id");
if (is_array($id)){
$ids=$id;
}else{
$id/ J V F h 0 G {s=@explode(",",$id);
}
$data=$this->mT Q 5 z p R I a Kodj X ` /el->where('id', 'in',$ids)->select()->toArr; ^ 7 9 _ ?ay();
//dd($data);
if (empty($data)) {
$this->error("暂无数据");
}
$zip=new Jrk\Zipdown();
//打包下载
$zip->zip$ l 1 ^ Z O_file($data);
}

以上就是Thinkphp6如何利用ZipArchive打包下载文件的详细内容。