防止 zip 存档在两个不同的文件夹中下载两次

prevent zip archive download twice in two different folder

我尝试使用 zip 存档创建一个 zip 文件,虽然 zip 文件同时在两个不同的文件夹中下载两次,但它工作正常,源代码所在的 htdocs 文件夹和浏览器设置的默认下载文件夹.有什么办法可以防止这种情况发生吗?我只想将它下载到下载文件夹中一次...

   $file_names = explode(',', $_REQUEST['files']);

   $dir = $_REQUEST['currentdir'];

   //Archive name
   $archive_file_name="Downloaded_".date("Y-m-d_G-i-s").".zip"; 

   //Download Files path
   $file_path=$dir;

   //cal the function
   zipFilesAndDownload($file_names,$archive_file_name,$file_path);

   function zipFilesAndDownload($file_names,$archive_file_name,$file_path)
   {
   $zip = new ZipArchive();
   $res = $zip->open($archive_file_name, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE );
if ($res===TRUE) {
//add each files of $file_name array to archive
foreach($file_names as $files)
{
    $tt=$file_path."/".$files;
    if (file_exists($tt)){
    $zip->addFile($tt,$files);
    }
    else{
        return false;
        exit;
    }
}
$zip->close();

//then send the headers to force download the zip file
header('Content-type: application/zip'); 
header("Content-Disposition: attachment; filename=\"".basename($archive_file_name)."\""); 
header('Pragma: no-cache'); 
header('Expires: 0'); 
//header('Content-Length: ' . filesize($archive_file_name));
ob_end_clean();
//flush();
readfile($archive_file_name);
exit; 
}
else{
    return false;
    exit;
}

}

下载完成后,您可以删除服务器上的文件:

(...)

ob_end_clean();
//flush();
readfile( $archive_file_name );
unlink( $archive_file_name );

(...)

您的 PHP 脚本在本地目录中创建 zip,这是您的 htdocs 目录。

您现在有几个选择:

  • 使用 php (readfile)
  • 读取存档后删除 zip 存档
  • 在子目录中创建 zip 存档,如果您需要保存它供以后使用(存档)
  • 在临时文件夹中创建 zip,使用后删除 zip

我会选择选项 3,因为它将确保如果脚本在能够删除之前死掉,zip 将被删除。

您可以使用unlink() 命令删除文件。您只需将文件名或文件路径传递给它,它就会执行(如果文件存在)。如果要将其保存在子目录中,只需在文件名前加上目录名和目录分隔符。如果你想保存它,例如在子目录 'downloads' 中,您只需在文件名前添加 downloads/$archive_file_name="downloads/Downloaded_".date("Y-m-d_G-i-s").".zip";

此处更好的选择是在服务器的临时目录中创建 zip 文件并手动删除它,这样 zip 文件会在完成后立即被清除。您将使用 sys_get_temp_dir() 获得服务器的临时目录,您可以将其添加到文件名前。完成业务后,您可以使用 unlink() 删除文件。 $archive_file_name=sys_get_temp_dir()."Downloaded_".date("Y-m-d_G-i-s").".zip";

当你完成并想删除你刚才做的文件时 unlink($archive_file_name);

函数参考:

http://php.net/unlink

http://php.net/sys_get_temp_dir