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

时间:2016-01-27 02:01:24

标签: php download readfile ziparchive

我尝试使用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;
}

}

2 个答案:

答案 0 :(得分:2)

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

您现在有几个选择:

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

我会使用选项3,因为如果脚本在删除之前就会确保删除zip。

您可以使用unlink()命令删除文件。您只需将文件名或文件路径传递给它,它就会执行它(如果文件存在)。如果要将其保存在子目录中,只需将目录名称与目录分隔符一起添加到文件名中。如果你想保存它,例如在子目录'下载'中,您只需在文件名前添加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

答案 1 :(得分:0)

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

(...)

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

(...)