我正在创建一个包含多个脚本的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);
}
答案 0 :(得分:0)
根据我的理解,必须保存zip文件,它不能存储在内存中。 $ zip->关闭();是实际触发文件创建的内容。我相信有人比我更聪明,我会弄清楚如何将它写入记忆,但现在有一个简单的解决方法。
我刚刚做了类似的事情。诀窍是使用:
// Keep script running even if user aborts
ignore_user_abort(true);
将此添加为脚本的第一行。这样做是允许您的下载脚本运行,即使用户中止下载。这将确保您的删除命令被调用。
即使用户没有中止,我也不确定您是否正在说文件是否正确删除。但是如果你当前的删除命令没有按预期工作,你可以使用一个简单的:
unlink( $zipName);
希望这有帮助。