试过了php自带的扩展ZipArchive,发现处理中文路径,文件名实在是太难了,处理不了。使用pclzip发现非常简单好用。
过程中处理了中文路径,文件名问题,以及转义字符问题
附上代码:
<?php
include_once('pclzip.lib.php');
$rootPath = $_SERVER['DOCUMENT_ROOT'];//网站根目录
header("Content-type:text/html;charset=UTF-8");
// $titleLe=$_POST["$titleL"];
// $password=$_POST['password'];
$titleL="全国大学生电子商务“创新、创意及创业”挑战赛";
// $yuming="http://www.keyan.sjzlg.com:7070";
$date = date("YmdHis");
require "connet.php";
$conn=new Mysql();
$sql="SELECT fujian FROM cansai WHERE zhuangtai=3 AND title LIKE '%".$titleL."%';";
$result=$conn->sql($sql);
$result = $result->fetch_all(MYSQLI_ASSOC);
foreach ($result as $fujian){
$fujian['fujian']=addcslashes($fujian['fujian'],"\\"); //将转义字符\变成\\防止转义,这一步必须提前到这里,放后面特殊字符\已经转义了
// echo $fujian['fujian'].",";
$fujian['fujian']=$rootPath . $fujian['fujian'];
$files[]=$fujian['fujian'];
// array_push($files,$fujian['fujian']);
};
$filespath = implode(',',$files);//数组拼接成字符串
$filespath=iconv('utf-8','gbk//IGNORE',$filespath); //将utf-8转换成gbk,解决中文乱码问题
// $filespath=addcslashes($filespath,"\\");//将转义字符\变成\\防止转义
// echo $filespath;
$zipname='archive.zip';
$archive = new PclZip($zipname);
$v_list = $archive->create($filespath,PCLZIP_OPT_REMOVE_ALL_PATH); //把所有路径都去掉,这个压缩档建立完后,不会有目录了
// $v_list = $archive->add("data/file.txt", PCLZIP_OPT_NO_COMPRESSION);//将一个档案加入一个压缩档中,但不会对此档案压缩
if ($v_list == 0) {
die("Error : ".$archive->errorInfo(true));
}else{
$file_name = "/sever/".$zipname;
// $file_name = iconv("utf-8","gbk//IGNORE",$file_name); // 特别注意!特别注意!特别注意这里,windows下必须开转码,不然直接文件不存
$file_path = $_SERVER['DOCUMENT_ROOT'] . $file_name;// 比如windows下这里我的是 "D:/web/public/upload/files/2019/04-29/中文测试包.rar"
//判断如果文件存在,则跳转到下载路径
if (!file_exists($file_path)) {
die("文件不存在!");
}
$fp = fopen($file_path, "r+") or die('打开文件错误'); //下载文件必须要将文件先打开。写入内存
$file_size = filesize($file_path);
//返回的文件流
Header("Content-type:application/octet-stream");
//按照字节格式返回
Header("Accept-Ranges:bytes");
//返回文件大小
Header("Accept-Length:" . $file_size);
//弹出客户端对话框,对应的文件名
Header("Content-Disposition:attachment;filename=" . substr($file_name, strrpos($file_name, '/') + 1));
//防止服务器瞬间压力增大,分段读取
$buffer = 1024;
while (!feof($fp)) {
$file_data = fread($fp, $buffer);
echo $file_data;
}
fclose($fp);
unlink($zipname);
die("下载成功!");
}
@readfile($zipname);不知道为什么用readfile打开文件会提示 “压缩包损坏或文件不存在的问题”
用fopen打开就可以。。
附上插件下载: