参考代码为tp5 类放在extend里,命名空间看情况,本人是放在一个crepdf的文件夹里的
<?php
namespace crepdf;
use think\Request;
class FileOption
{
//创建压缩文件
public function create_zip($path, $filename)
{
$zip = new \ZipArchive();
if ($zip->open($filename . '.zip', \ZipArchive::CREATE | \ZipArchive::OVERWRITE)) {
$this->addFileToZip($path, $zip); //调用方法,对要打包的根目录进行操作,并将ZipArchive的对象传递给方法
$zip->close(); //关闭处理的zip文件
}
}
//添加压缩文件
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->addFile($path . "/" . $filename);
}
}
}
@closedir($path);
}
/**
* @param $path 要下载的文件路径
*/
public function download($path)
{
if (!file_exists('.' . $path)) {
exit('文件不存在或已经删除');
};
$request = Request::instance();
$domain = $request->domain(); //当前域名
$file = $domain . $path; //图片完整路径
$fileTmp = pathinfo($file);
$fileExt = $fileTmp['extension']; //图片后缀名
$filename = time() . mt_rand(99, 999); //图片名称,可以任务设置图片名称
$saveFileName = ($filename . '.' . $fileExt);
$fp = fopen($file, "r");
//下载文件需要用到的头
Header("Content-type: application/octet-stream");
Header("Accept-Ranges: bytes");
Header("Content-Disposition: attachment; filename=" . $saveFileName);
$buffer = 1024;
$file_count = 0;
//向浏览器返回数据
while (!feof($fp)) {
$file_con = fread($fp, $buffer);
$file_count += $buffer;
echo $file_con;
}
fclose($fp);
unlink('.' . $path);
}
//删除文件夹以及下面所有文件
public static function deleteDir($dir)
{
if (!$handle = @opendir($dir)) {
return false;
}
while (false !== ($file = readdir($handle))) {
if ($file !== "." && $file !== "..") { //排除当前目录与父级目录
$file = $dir . '/' . $file;
if (is_dir($file)) {
self::deleteDir($file);
} else {
@unlink($file);
}
}
}
@rmdir($dir);
}
//将文件添加到压缩文件夹并下载
public static function downloadZip($files)
{
$zip = new \ZipArchive();
// ZIP文件的名称
$zipFileName = __DIR__ . "发票$id-" . time() . mt_rand(99, 9999) . ".zip";
// 打开ZIP文件进行创建,如果文件存在则覆盖
if ($zip->open($zipFileName, \ZipArchive::CREATE | \ZipArchive::OVERWRITE) === TRUE) {
// 遍历图片数组,将图片添加到ZIP文件
foreach ($files as $image) {
// 添加文件到zip,参数1:存储在zip中的文件名,参数2:要压缩的文件路径
$res = $zip->addFile('.' . $image, basename($image));
}
// 关闭ZIP文件
$zip->close();
// 设置HTTP头部进行下载
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="' . basename($zipFileName) . '"');
header('Content-Length: ' . filesize($zipFileName));
// 清除缓冲区并关闭输出缓冲
ob_clean();
flush();
// 读取ZIP文件并删除服务器上的ZIP文件
readfile($zipFileName);
unlink($zipFileName);
} else {
echo '无法创建ZIP文件';
}
}
}
调用
$folder =time() . mt_rand(99, 9999);//文件名
$fileOption = new FileOption();
$path = './' . $folder;
$fileOption->create_zip($path, $path);
$fileOption->download($path);
$fileOption->deleteDir($path);