0
感谢这个论坛上的用户社区,我写了一个非常简单的网页表单,它允许我的用户从他们的互联网浏览器中查看文本文件。表格一遍又一遍地下载相同的ZIP文件
我现在有两个函数,搜索返回的文本文件被压缩成ZIP。这里是我的代码
function getFilesFromSite() {
$result = null;
$ZIPresult = null;
if (empty($_POST['DBSite'])) { return null; }
$mydir = MYDIR;
$dir = opendir($mydir);
$DBSite = $_POST['DBSite'];
$getfilename = mysql_query("select filename from search_table where site='" . $DBSite . "'") 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("/bin/rm -f SearchResult.zip;/usr/bin/zip -9 SearchResult.zip ". $ZIPresult ." > /dev/null ");
//header for forced download
header("Pragma: public");
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
$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 . '"');
ob_start(); // Starts output buffering.
readfile($fileName); // "Outputs" the file.
$content = ob_get_flush(); // Grabs the output and assigns it to a variable.
print base64_encode($content);
}
function getFilesFromError() {
//Just a copy paste from above with different input parameter...
}
问题是,带有来自任何搜索内容的ZIP文件首先被一遍又一遍地下载下载。例如,即使我之后使用getFilesFromError()进行了搜索,getFilesFromSite()的结果也会始终得到下载。
我怀疑我的标题设置不正确,但我不确定在哪里。 PS:新的ZipArchive()库/类在我们的生产环境中不可用,因此我选择使用Unix实用程序ZIP来替代。
您的脚本实际上是否完全执行?换句话说,你一路上遇到什么错误?我的猜测是,一旦创建了SearchResult.zip,你的'shell_exec'调用可能会遇到文件权限错误。 – 2011-12-23 19:24:59
请勿复制粘贴这样的代码,请使用循环 – 2011-12-23 19:28:31
您的标题说数据是二进制的,但是您base64它 – 2011-12-23 19:29:31