php 打包压缩文件并下载,处理了中文路径以及路径中转义字符问题

试过了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打开就可以。。

 

附上插件下载:

点击下载pclzip插件

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值