【问题标题】:prevent zip archive download twice in two different folder防止 zip 存档在两个不同的文件夹中下载两次
【发布时间】:2016-01-27 02:01:23
【问题描述】:

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

}

【问题讨论】:

  • 您在 htdocs 文件夹中创建 zip(PHP 将其保存在那里),这就是它存在的原因。您只需下载一次。
  • 代码必须在 htdocs 中才能运行,因为我所有的 php 代码都在 htdocs 中运行...有什么代码或方法可以阻止它生成文件到 htdocs 中吗?
  • 您可以使用在文件名前添加一个目录名,然后将其保存在该目录中。

标签: php download readfile ziparchive


【解决方案1】:

您的 PHP 脚本在本地目录(即您的 htdocs 目录)中创建 zip。

你现在有几个选择:

  • 用php(readfile)读取压缩包后删除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

【讨论】:

  • 您好,感谢您的回复,我已经尝试了您的所有建议。它将删除默认下载文件夹中的文件,而不是我希望它相反的 htdocs 文件夹中的文件。所以我尝试手动将 unlink('C:\\xampp\\htdocs\\test\\'.$archive_file_name );删除它,但结果仍然会删除默认文件夹中的文件,而不是 htdocs ..
  • 这几乎是不可能的。 PHP 不知道您将下载的文件保存在哪里。您确定没有将下载的文件保存到 htdocs 文件夹中?
  • 天哪,我的错,我几分钟前在浏览器设置中打勾,将其保存到另一个默认文件夹,现在一切正常!非常感谢!!!!
【解决方案2】:

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

(...)

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

(...)

【讨论】:

  • 嗨,我试过了,但它会删除默认下载文件夹中的文件,而不是 htdocs 文件夹中的文件...
  • 我的错误 ^^" 我几分钟前在浏览器设置中打勾,将其保存到另一个默认文件夹,现在一切正常!非常感谢!!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-25
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 1970-01-01
相关资源
最近更新 更多