PHP即时创建和下载ZIP

时间:2014-09-03 14:25:04

标签: php download zip

我正在创建一个包含多个脚本的ZIP文件(例如: test.php functions.js style.css )。

脚本工作正常,唯一的问题是ZIP文件放在我的网络服务器上。有办法防止这种情况吗?我已经阅读了多个类似的问题:this one似乎有效,但我无法弄清楚如何使用它。

所以,我不想删除文件(即使用户中止)或者(甚至更好)我的脚本永远不会将文件放在网络服务器上。

的download.php

$scriptId = checkNumeric($_GET['sid']);

//Check if user has access to the script
if(isLoggedIn() && hasScriptAccess($scriptId))  {

    //Create ZIP
    $zip = new ZipArchive();
    $zipName = "script.zip";

    if ($zip->open($zipName, ZIPARCHIVE::CREATE)!== TRUE) {
        exit(); //Something went wrong while creating the ZIP
    }

    //Get associated codes
    $query = $mysqli->query("SELECT * FROM code WHERE script_id = '{$scriptId}'");
    while($code = $query->fetch_assoc()) {
        $filename = $code['title'];
        $content = $code['code'];

        //Add file to ZIP
        $zip->addFromString($filename, $content);
    }

    $zip->close();

    //Set headers
    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($zipName));

    clearstatcache(); //Make sure the file size isn't cached
    readfile($zipName); //Output the file
    $zip->deleteName($zipName);
}

1 个答案:

答案 0 :(得分:0)

根据我的理解,必须保存zip文件,它不能存储在内存中。 $ zip->关闭();是实际触发文件创建的内容。我相信有人比我更聪明,我会弄清楚如何将它写入记忆,但现在有一个简单的解决方法。

我刚刚做了类似的事情。诀窍是使用:

// Keep script running even if user aborts
ignore_user_abort(true);

将此添加为脚本的第一行。这样做是允许您的下载脚本运行,即使用户中止下载。这将确保您的删除命令被调用。

即使用户没有中止,我也不确定您是否正在说文件是否正确删除。但是如果你当前的删除命令没有按预期工作,你可以使用一个简单的:

unlink( $zipName);

希望这有帮助。