在 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 浏览器中不起作用