下面給大家介紹Thinkphp6利用ZipArchive打包下載文件的方法,希望對需要的朋友有所幫助!
基礎環(huán)境
系統(tǒng)環(huán)境:Windows10 x64
PHP集成環(huán)境:phpstudy
PHP依賴管理工具:Composer
手冊:Thinkphp
(一)下載tp6框架
composer create-project topthink/think tp6
(二)打包下載類
<?php
namespace Jrk;
class Zipdown
{
/**
* 打包壓縮文件及文件夾
*
* @Author Hhy <[email protected]>
* @DateTime 2020-07-10 13:20:06
* @param array $files
* @param string $zipName 壓縮包名稱
* @param boolean $wen
* @param boolean $isDown
* @return void
**/
public function zip_file($files = [], $zipName = '', $wen = true,$isDown = true){
$zip_file_path='zip/';
// 文件名為空則生成文件名
if (empty($zipName)) {
$zipName = $zip_file_path.date('YmdHis') . '.zip';
}else{
$zipName=$zip_file_path.$zipName.'.zip';
}
// 實例化類,使用本類,linux需開啟zlib,windows需取消php_zip.dll前的注釋
$zip = new \ZipArchive;
/*
* 通過ZipArchive的對象處理zip文件
* $zip->open這個方法如果對zip文件對象操作成功,$zip->open這個方法會返回TRUE
* $zip->open這個方法第一個參數(shù)表示處理的zip文件名。
* 這里重點說下第二個參數(shù),它表示處理模式
* ZipArchive::OVERWRITE 總是以一個新的壓縮包開始,此模式下如果已經存在則會被覆蓋。
* ZipArchive::OVERWRITE 不會新建,只有當前存在這個壓縮包的時候,它才有效
* */
if ($zip->open($zipName, \ZIPARCHIVE::OVERWRITE | \ZIPARCHIVE::CREATE) !== true) {
exit('無法打開文件,或者文件創(chuàng)建失敗');
}
// 文件夾打包處理
if (is_string($files)) {
// 文件夾整體打包
$this->addFileToZip($files, $zip);
} else {
// 文件打包
foreach ($files as $val) {
if(file_exists(app()->getRootPath().'public'.$val['att_dir'])){
if($wen){
//根據(jù)存儲的文件夾打包分層
$zip->addFile(app()->getRootPath().'public'.$val['att_dir'], iconv('UTF-8','gbk',$val['img_dir'].'/'.$val['name']));
}else{
//不分層
$zip->addFile(app()->getRootPath().'public'.$val['att_dir'], iconv('UTF-8','gbk',$val['name']));
}
}
}
}
// 關閉
$zip->close();
// 驗證文件是否存在
if (!file_exists($zipName)) {
exit("文件不存在");
}
if ($isDown) {
// ob_clean();
// 下載壓縮包
header("Cache-Control: public");
header("Content-Description: File Transfer");
header('Content-disposition: attachment; filename=' . basename($zipName)); //文件名
header("Content-Type: application/zip"); //zip格式的
header("Content-Transfer-Encoding: binary"); //告訴瀏覽器,這是二進制文件
header('Content-Length: ' . filesize($zipName)); //告訴瀏覽器,文件大小
@readfile($zipName);//ob_end_clean();
@unlink(app()->getRootPath().'public/'.$zipName);//刪除壓縮包
} else {
// 直接返回壓縮包地址
return $zipName;
}
}
/**
* 添加文件至壓縮包
* @Author Hhy <[email protected]>
* @DateTime 2020-07-10 13:20:26
* @param [type] $path
* @param [type] $zip
* @return void
*/
public function addFileToZip($path, $zip)
{
// 打開文件夾
$handler = opendir($path);
while (($filename = readdir($handler)) !== false) {
if ($filename != "." && $filename != "..") {
// 編碼轉換
$filename = iconv('gb2312', 'utf-8', $filename);
// 文件夾文件名字為'.'和‘..’,不要對他們進行操作
if (is_dir($path . "/" . $filename)) {
// 如果讀取的某個對象是文件夾,則遞歸
$this->addFileToZip($path . "/" . $filename, $zip);
} else {
// 將文件加入zip對象
$file_path = $path . "/" . $filename;
$zip->addFile($file_path, basename($file_path));
}
}
}
// 關閉文件夾
@closedir($path);
}
/**
* 壓縮文件解壓
*
* @Author Hhy <[email protected]>
* @DateTime 2020-07-10 13:23:11
* @param [type] $file
* @param [type] $dirname
* @return void
*/
public function unzip_file($file, $dirname)
{
if (!file_exists($file)) {
return false;
}
// zip實例化對象
$zipArc = new \ZipArchive();
// 打開文件
if (!$zipArc->open($file)) {
return false;
}
// 解壓文件
if (!$zipArc->extractTo($dirname)) {
// 關閉
$zipArc->close();
return false;
}
return $zipArc->close();
}
}(三)使用,親測有效
/** * @author: Hhy <[email protected]> * @date: 2020/7/2 0002 * @describe:打包下載 */ public function download() { $id= $this->request->param("id"); if (is_array($id)){ $ids=$id; }else{ $ids=@explode(",",$id); } $data=$this->model->where('id', 'in',$ids)->select()->toArray(); //dd($data); if (empty($data)) { $this->error("暫無數(shù)據(jù)"); } $zip=new Jrk\Zipdown(); //打包下載 $zip->zip_file($data); }






