PHP下载脚本在Mac上创建不可读的ZIP文件

作为参考,我已经阅读并尝试了这些和其他几个线索的答案:

用php创建和提供压缩文件

打开下载的zip文件创建cpgz文件?

我的服务器上有一个zip文件。

  • 当我使用Filezilla将Zip文件从我的服务器移动到我的Mac时,我可以正常打开它。

  • 当我使用这个PHP代码将Zip文件下载到我的Linux机器时,它会正常打开。

  • 当我使用此PHP代码将Zip文件下载到我的Mac时,使用Safari或Firefox时,出现“Decompression Failed”或“The archive of the archive is damaged”的错误,或者我得到一个.cpgz文件 - 我相信意味着计算机正在压缩文件,而不是将其解压缩。

  • 这里是我用来提供zip文件的PHP代码。

    $zipname = "myfile.zip";
    $zippath = "/path/to/" . $zipname;
    
          if ($downloadzip = fopen ($zippath, "r")) {
                $fsize = filesize($zippath);
    
                header("Content-type: application/zip");
                header("Content-Disposition: attachment; filename="".$zipname.""");
                header("Content-length: $fsize");
                header('Content-Transfer-Encoding: binary');
                #header("Cache-control: private"); //use this to open files directly
    
                echo fpassthru($downloadzip); // deliver the zip file
    
            }
            fclose ($downloadzip);
    

    我发现一些头文件可以工作。 我真的不知道或不在乎它为什么工作,我只是很高兴它的工作原理...我尝试了很多不同的东西,.htaccess文件,php.ini / zlib设置。

    这是答案http://perishablepress.com/http-headers-file-downloads/

    $zipName = 'myfile.zip';
    $zipPath = 'mydirectory/' . $zipName;
    
    
        if (file_exists($zipPath)) {
    
            header("Pragma: public");
            header("Expires: 0");
            header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
            header("Cache-Control: public");
            header("Content-Description: File Transfer");
            header("Content-type: application/octet-stream");
            header("Content-Disposition: attachment; filename="".$zipName.""");
            header("Content-Transfer-Encoding: binary");
            header("Content-Length: ".filesize($zipPath));
            ob_end_flush();
            @readfile($zipPath);
    }
    

    通常,问题是由读出文件之前打印或回显到页面的额外字符引起的。 即使是空间也会导致失败。 要解决这个问题,请调用ob_end_clean(); 在读取将清除输出缓冲区并关闭缓冲区的文件之前。

    但请记住,您可以嵌套输出缓冲区,这也会破坏您的下载(为了解决这个问题,向Vladamir欢呼)。 因此,在读取文件之前清除输出缓冲区完全运行:

    while (ob_get_level()) {
        ob_end_clean();
    }    
    

    这将清除你的整个缓冲区,你不会有任何额外的字符来搞乱你的下载。

    对于那些有兴趣我已经粘贴下面的我的下载脚本。 我的zip文件现在可以完美下载,到目前为止,这很好。

    if (file_exists($zip_file_path)) {
    
            header("Pragma: public");
            header("Expires: 0");
            header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
            header("Cache-Control: public");
            header("Content-Description: File Transfer");
            //We can likely use the 'application/zip' type, but the octet-stream 'catch all' works just fine.  
            header("Content-type: application/octet-stream");
            header("Content-Disposition: attachment; filename='$zip_file_name'");
            header("Content-Transfer-Encoding: binary");
            header("Content-Length: ".filesize($zip_file_path));
    
            while (ob_get_level()) {
                 ob_end_clean();
            }
    
            @readfile($zip_file_path);
    
            exit;
    }
    

    这是有用的

    $zipName = 'myfile.zip';
    $zipPath = 'mydirectory/' . $zipName;
    
        if (file_exists($zipPath)) {
    
            header("Pragma: public");
            header("Expires: 0");
            header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
            header("Cache-Control: public");
            header("Content-Description: File Transfer");
            header("Content-type: application/octet-stream");
            header("Content-Disposition: attachment; filename="".$zipName.""");
            header("Content-Transfer-Encoding: binary");
            header("Content-Length: ".filesize($zipPath));
            ob_end_flush();
            @readfile($zipPath);
    }
    

    好吧,我想你知道你的$ fsize变量没有被写入该头文件,因为它被引号引起来。 你可以尝试这样的事情:

    header('Cache-Control: public');
    header('Content-Description: File Transfer');
    header('Content-Disposition: attachment; filename="".$zipname.""');
    header('Content-Type: application/zip');
    
    链接地址: http://www.djcxy.com/p/57025.html

    上一篇: PHP Download Script Creates Unreadable ZIP File on Mac

    下一篇: Protecting files in Android with a password