php实现文件下载,提示压缩包损坏解决方法

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);
    }

最后就可得到下载后正常的压缩包了

猜你喜欢

转载自blog.csdn.net/qq_38054219/article/details/85813329