php将文件添加到压缩包中实现文件下载,最后下载下来的压缩包打不开,提示压缩包损坏。
错误代码如下:(网上大部分代码都是这种)
$filename=$_POST['del'];
if($filename!=''){ //去掉空值的情况(没有选中任何项,无表单传值)
$fileurl = "upload/download.zip"; //最终生成的文件名(含路径)
if(!file_exists($fileurl)){ //重新生成文件
$zip = new ZipArchive();//使用本类,linux需开启zlib,windows需取消php_zip.dll前的注释
if ($zip->open($fileurl, ZIPARCHIVE::CREATE)!==TRUE) {
exit('无法打开文件,或者文件创建失败');
}
foreach($filename as $val){
$val=iconv("utf-8","gb2312",$val);
echo $val;
if(file_exists("upload/$val")){
$sql = "UPDATE file SET down=down+'1' WHERE filename = '$val'"; //执行更新点击数的语句
$conn = @mysqli_connect("localhost","root","123456","resourceadm");
mysqli_query($conn,$sql); //执行语句
$zip->addFile( "upload/$val", basename($val));//第二个参数是放在压缩包中的文件名称,如果文件可能会有重复,就需要注意一下
}
}
$zip->close();//关闭
}
if(!file_exists($fileurl)){
exit("无法找到文件"); //即使创建,仍有可能失败。。。。
}
header("Cache-Control: public");
header("Content-Description: File Transfer");
header('Content-disposition: attachment; filename='.basename($fileurl)); //文件名
header("Content-Type: application/zip"); //zip格式的
header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件
header('Content-Length: '. filesize($fileurl)); //告诉浏览器,文件大小
@readfile($fileurl);
unlink($fileurl);
}
通过运行上面的代码将会出现压缩包损坏问题。
解决办法是在最后加上两行代码:
ob_clean();
flush();
正确代码如下所示:
$filename=$_POST['del'];
if($filename!=''){ //去掉空值的情况(没有选中任何项,无表单传值)
$fileurl = "upload/download.zip"; //最终生成的文件名(含路径)
if(!file_exists($fileurl)){ //重新生成文件
$zip = new ZipArchive();//使用本类,linux需开启zlib,windows需取消php_zip.dll前的注释
if ($zip->open($fileurl, ZIPARCHIVE::CREATE)!==TRUE) {
exit('无法打开文件,或者文件创建失败');
}
foreach($filename as $val){
$val=iconv("utf-8","gb2312",$val);
echo $val;
if(file_exists("upload/$val")){
$sql = "UPDATE file SET down=down+'1' WHERE filename = '$val'"; //执行更新点击数的语句
$conn = @mysqli_connect("localhost","root","123456","resourceadm");
mysqli_query($conn,$sql); //执行语句
$zip->addFile( "upload/$val", basename($val));//第二个参数是放在压缩包中的文件名称,如果文件可能会有重复,就需要注意一下
}
}
$zip->close();//关闭
}
if(!file_exists($fileurl)){
exit("无法找到文件"); //即使创建,仍有可能失败。。。。
}
header("Cache-Control: public");
header("Content-Description: File Transfer");
header('Content-disposition: attachment; filename='.basename($fileurl)); //文件名
header("Content-Type: application/zip"); //zip格式的
header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件
header('Content-Length: '. filesize($fileurl)); //告诉浏览器,文件大小
ob_clean(); //*******************修改部分*******************************
flush(); //*******************修改部分*******************************
@readfile($fileurl);
unlink($fileurl);
}
最后就可得到下载后正常的压缩包了