在 php 中创建和下载 zip 存档

Posted

技术标签:

【中文标题】在 php 中创建和下载 zip 存档【英文标题】:create and download zip archive in php 【发布时间】:2017-12-01 06:32:31 【问题描述】:

我创建了一个 zip 文件并下载它。但我的问题是我只想下载特定文件而不是根文件夹的完整文件。

我的代码是

$zipname = 'documents.zip';
$zip = new ZipArchive;
$zip->open($zipname, ZipArchive::CREATE);
foreach ($allDocuments as $document) 
  $filetopath = public_path().$document;
  $filename = explode('/',$document);
  $name = end($filename);
  $zip->addFile($filetopath,$name);
 
$zip->close();

header('Content-Type: application/zip');
header('Content-disposition: attachment; filename='.$zipname);
header('Content-Length: ' . filesize($zipname));
readfile($zipname); 

我只想制作一个 zip 文件,它只包含命名的文件,没有任何文件夹,并且包含特定文件而不是根文件夹的所有文件。但是我得到了所有文件夹和所有文件。

在 $alldocumnets 变量中,我得到了有限的记录,而不是所有记录。 但是在创建 zip 时,它会获取所有文件。

我不明白我哪里错了。

【问题讨论】:

【参考方案1】:

关于目录的问题很明确:排除所有 is_dir() == true

<?php
$allDocuments = array("a.py","b.py");

$zipname = 'documents.zip';
$zip = new ZipArchive;
$zip->open($zipname, ZipArchive::CREATE);
foreach($allDocuments as $document) 
  $filetopath = getcwd().'\\'.$document;
  if(!is_dir($filetopath)) 
    $filename = explode('/',$document);
    $name = end($filename);
    $zip->addFile($filetopath,$name);
  
 
$zip->close();

header('Content-Type: application/zip');
header('Content-disposition: attachment; filename='.$zipname);
header('Content-Length: ' . filesize($zipname));
readfile($zipname);

很遗憾,第二部分不清楚。只要您不告诉我们您打算排除哪些文件或确切的问题是什么,这是无法挽救的。

【讨论】:

我已经通过动态设置 zipname 解决了这个问题。实际上我有日期范围,根据该范围,我从数据库中获取文档并创建一个 zip 文件并下载。如果我设置日志范围,那么我有很多 zip 文件,这很好。但在那之后,如果我设置一个小的日期范围,那么我应该得到更少的文件,但我仍然得到所有以前的文件。这是因为相同的 zipname。 当我设置 zipname 动态然后它工作正常。但这不是最好的解决方案,我需要这个问题的最佳解决方案。我还使用了 $zip->open($zipname, ZipArchive::OVERWRITE); 我不太明白你的意思。我这个答案没有帮助,我请删除它。否则,请点赞并接受。

以上是关于在 php 中创建和下载 zip 存档的主要内容,如果未能解决你的问题,请参考以下文章

从内存中的 url 下载图像并在内存中创建 zip 存档以发送到浏览器

如何在 SQL Server 2005 中创建和维护最近 7 天的分区视图和存档记录?

在 php 中创建 zip 和下载在 Mozilla 浏览器中不起作用

如何使用 maven 程序集插件在 tar 中创建和包含 zip 文件

使用 CURL 下载的档案无效

PHP on the fly ZIP 下载为空白