1.添加文件到压缩文件中,文件太大或者太小添加失败问题。
2.文件路径有中文或特殊字符时不能使用$zip->addFile($file,basename($file));
我的例子:
-
<?php
-
$rootPath = $_SERVER[
'DOCUMENT_ROOT'];
//网站根目录
-
$files[] =
"C:\Users\Administrator\Pictures\a9290e3daadbf937e77f09f9eaa8aa40.jpg";
//必须绝对路径,为什么有些图片添加不进去压缩包里?是大小问题吗?
-
$files[] =
"C:\Users\Administrator\Pictures\shenm.jpg";
-
$files[] =
"C:\Users\Administrator\Pictures\2021-05-11.pdf";
-
$files[] =
"C:\Users\Administrator\Pictures\11111.jpg";
-
$files[] =
"C:\Users\Administrator\Pictures\t0160c8456511be3c4e.jpg";
-
$files[] =
"C:\wamp64\www\sever\uploads\2021-04-09\abc.pdf";
-
$files[] =
"C:\wamp64\www\sever\uploads\2021-04-09\abcd.pdf";
-
$files[] =
"C:\wamp64\www\sever\uploads\2021-04-29\汽车文化-袁建民(副主编).pdf";
-
$files[] =
"C:\wamp64\www\sever\uploads\2020-12-22\2020年三创赛校赛荣誉证书.pdf";
-
//以上几个文件太大,太小不成功,中文和‘-’字符不成功
-
-
-
$zipname =
'test.zip';
-
$zip =
new ZipArchive();
-
-
if($zip->open($zipname,ZipArchive::CREATE|ZipArchive::OVERWRITE))
-
{
-
foreach ($files
as $file) {
-
if( $zip->addFile($file,basename($file))){
-
echo
"0";
-
}
else{
-
echo
"1";
-
}
-
}
-
$zip->close();
-
}
-
// Then download the zipped file.
-
header(
'Content-Type: application/zip');
-
header(
'Content-disposition: attachment; filename='.$zipname);
-
header(
'Content-Length: ' . filesize($zipname));
-
-
@readfile($zipname);
-
-
@unlink($zipname);
//删除打包的临时zip文件。文件会在用户下载完成后被删除
上面代码会出现问题,文件太大,太小会输出1,中文路径和特殊字符‘-’会出问题,输出1;
使用 $list = iconv('utf-8', 'gbk', $file);转码并不能解决问题。
上面问题关键,在于
例如:$files[] = "C:\Users\Administrator\Pictures\11111.jpg";
这个字符串存储时已经被转义字符“\”,转义了(不是文件大小和特殊字符和中文问题)。所以必须在存储之前阻止转义。
-
$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']);
-
-
};
-
-
-
$zipname =
'test.zip';
-
$zip =
new ZipArchive();
-
-
if($zip->open($zipname,ZipArchive::CREATE|ZipArchive::OVERWRITE))
-
{
-
foreach ($files
as $file) {
-
if( $zip->addFile($file,basename($file))){
-
echo
"0";
-
}
else{
-
echo
"1";
-
}
-
}
-
$zip->close();
-
}
这样从数据库里拿出来数据直接处理了,就可以了。
附上网上一个例子:
真的百度用了很多办法。没有十全十美的。
填坑记录一下
纯PHP代码也试过压缩。但是不能压缩文件夹。只能把文件夹内所有文件压缩到一个文件里面。然后下载。。。。。。换
用PHP 自带的
ZipArchive
1.首先加扩展。我用的是集成xampp 。找到PHP/php.ini
加这个
extension=php_zip.dll 和打开zlib.output_compression=On off改成On
2.将扩展文件加在php/ext下
扩展文件下载路径:https://windows.php.net/downloads/pecl/releases/zip/
我的电脑是64x。PHP坂本是5.6的。选择对应的坂本。解压放入
重启apache
3.开始正式代码了。
我是thinkphp5.0的。原生和框架都可以使用
首先执行这个代码:
-
public
function zipupload(){
-
$path=
"./emptydir";
//要压缩的文件的绝对路径
-
$filename=
'niao';
//生成压缩文件名
-
$path
-
= iconv(
"UTF-8",
"GBK", $path);
//加这行中文文件夹也ok了
-
$this->create_zip($path,$filename);
-
if(!file_exists(
'./' . $filename .
'.zip')){
-
echo
1;
die;
-
}
-
header(
"Cache-Control: public");
-
header(
"Content-Description: File Transfer");
-
header(
'Content-disposition: attachment; filename=' . basename($filename .
'.zip'));
//文件名
-
header(
"Content-Type: application/zip");
//zip格式的
-
header(
"Content-Transfer-Encoding: binary");
//告诉浏览器,这是二进制文件
-
header(
'Content-Length: ' . filesize(
'./' . $filename.
'.zip'));
//告诉浏览器,文件大小
-
@readfile(
'./' . $filename .
'.zip');
//下载到本地
-
@unlink(
'./' . $filename .
'.zip');
//删除服务器上生成的这个压缩文件
-
}
-
-
-
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文件
-
}
-
}
-
-
-
//注意:一般是 $zip = new ZipArchive();如果无法调用就是用 $zip = new \ZipArchive();
-
-
//注意:$zip->open($filename.'.zip', ZipArchive::OVERWRITE)=== TRUE如果用这个可能会报错:我改成
-
-
$zip->open($filename.
'.zip', \ZipArchive::CREATE | \ZipArchive::OVERWRITE)
-
-
-
-
-
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);
-
}
public function zipupload(){
$path="./emptydir";//要压缩的文件的绝对路径
$filename='niao'; //生成压缩文件名
$path
= iconv("UTF-8", "GBK", $path);//加这行中文文件夹也ok了
$this->create_zip($path,$filename);
if(!file_exists('./' . $filename . '.zip')){
echo 1;die;
}
header("Cache-Control: public");
header("Content-Description: File Transfer");
header('Content-disposition: attachment; filename=' . basename($filename . '.zip')); //文件名
header("Content-Type: application/zip"); //zip格式的
header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件
header('Content-Length: ' . filesize('./' . $filename. '.zip')); //告诉浏览器,文件大小
@readfile('./' . $filename . '.zip');//下载到本地
@unlink('./' . $filename . '.zip');//删除服务器上生成的这个压缩文件
}
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文件
}
}
注意:一般是 $zip = new ZipArchive();如果无法调用就是用 $zip = new \ZipArchive();
注意:$zip->open($filename.'.zip', ZipArchive::OVERWRITE)=== TRUE如果用这个可能会报错:我改成
$zip->open($filename.'.zip', \ZipArchive::CREATE | \ZipArchive::OVERWRITE)
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);
}
结束。亲测可用!放心。不懂可以问我。
转载自:https://blog.csdn.net/hexiaoniao/article/details/89222983?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-6&spm=1001.2101.3001.4242
转载:https://blog.csdn.net/tongluren381/article/details/116648407