强制下载会破坏ZIP文件

时间:2011-12-22 19:50:59

标签: php

我写了一个非常简单的网页表单,允许我的用户在他们的互联网浏览器中查看文本文件。

我实现了一项功能,将搜索返回的文本文件压缩为ZIP。这是我的代码

        function getFiles() {
         $result = null;
         $ZIPresult = null;
         if (empty($_POST['DBRIDs'])) { return null; }
         $mydir = MYDIR; 
         $dir = opendir($mydir);
         $DBRIDs = $_POST['DBRIDs'];
         $getfilename = mysql_query("select filename from search_table where rid in (" . $DBRIDs . ")") or die(mysql_error());
         while ($row = mysql_fetch_array($getfilename)) {
         $filename = $row['filename'];
         $result .= '<tr><td><a href="' . basename($mydir) . '/' . $filename . '" target="_blank">' . $filename . '</a></td></tr>';
         $ZIPresult .= basename($mydir) . '/' . $filename;
        } 
        if ($result) {
        $result = "<table><tbody><tr><td>Search Results.</td></tr> $result</table>";
       shell_exec("zip -9 SearchResult.zip ". $ZIPresult ." > /dev/null ");

$fileName = 'SearchResult.zip';
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Transfer-Encoding: binary");
header('Content-type: application/zip');
header("Content-length: " . filesize($fileName));
header('Content-Disposition: attachment; filename="' . $fileName . '"');
readfile($fileName); 
        } return $result;
        }

效果很好如果我使用FTP从服务器下载ZIP文件(例如)但是我强制从页面标题下载,则ZIP已损坏。

我错过了什么?感谢您的投入。

PS:新的ZipArchive()库/类在我们的生产环境中不可用,所以我选择使用Unix实用程序ZIP。

1 个答案:

答案 0 :(得分:1)

这可能是编码问题。尝试使用Base64进行编码。

部首: header('Content-Transfer-Encoding: base64');

然后,要将文件base64_encoded()ed抛出到浏览器,请尝试以下操作:

ob_start(); // Starts output buffering.
readfile($fileName); // "Outputs" the file.
$content = ob_get_clean(); // Grabs the output and assigns it to a variable.
print base64_encode($content); // Encodes and prints the content to the browser.

请注意,简单base64_encode(readfile($fileName))将无效,因为readfile()输出数据但不返回数据。

希望它有所帮助!