首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >表单反复下载相同的ZIP

表单反复下载相同的ZIP
EN

Stack Overflow用户
提问于 2011-12-24 03:16:44
回答 1查看 58关注 0票数 0

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

我现在有两个函数,用来将搜索返回的文本文件压缩成ZIP。这是我的代码

代码语言:javascript
运行
复制
    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。

EN

Stack Overflow用户

回答已采纳

发布于 2011-12-28 03:28:02

使用Base64实际上不起作用的原因在这里已经说得很清楚了。相反,我关闭了zlib压缩,并恢复使用二进制作为输出格式。最后,我在头文件中将Content-Type设置为application/octet-stream。现在一切都很好;下面是我的代码:

代码语言:javascript
运行
复制
function getFiles() {
     ini_set('zlib.output_compression', 'Off');  
     $result = null;
     $ZIPresult = null;
     $cleanup = null;
     $output = null;
     $fileName = null;
    //remove old zip if any
     $cleanup = shell_exec("/bin/rm -f SearchResult.zip");
     error_log("SHELL OUTPUT=>" . $cleanup, 0);
     //test
     if (empty($_POST['DBRIDs'])) { return null; }
     $mydir = MYDIR; // set from the CONSTANT 
     $dir = opendir($mydir);
     $DBRIDs = $_POST['DBRIDs'];
     $getfilename = mysql_query("select /*! SQL_CACHE */ filename from automation 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>";
    $output = shell_exec("/usr/bin/zip SearchResult.zip ". $ZIPresult ." ");
    error_log("SHELL OUTPUT=>" . $output, 0);
    $fileName = 'SearchResult.zip';
    error_log("ZIP FILENAME=>" . $fileName, 0);

    if (file_exists($fileName)) {
    //header for forced download
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename='.basename($fileName));
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: ' . filesize($fileName));
        ob_clean();
        flush();
        readfile($fileName);
        exit;
        }
    }

    return $result;
    }

感谢大家抽出时间!!

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8619814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档