如何使用标头php下载zip文件而不将其保存在服务器上

Posted

技术标签:

【中文标题】如何使用标头php下载zip文件而不将其保存在服务器上【英文标题】:how to make zip file downloadable with headers php without saving it on the server 【发布时间】:2012-12-04 15:53:56 【问题描述】:

我有这个代码

<?php
$files = array('includes/s.xlsx', 'includes/test.html');
$zipname = 'file.zip';
$zip = new ZipArchive;
$zip->open($zipname, ZipArchive::CREATE);
foreach ($files as $file) 
  $zip->addFile($file);
 
$zip->close();


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

但我不想将 zip 文件保存到服务器,我只想将它提供给用户。

【问题讨论】:

【参考方案1】:

ZIP 不是流式格式(目标需要支持查找,即不能简单地将 ZIP 文件写入目标,其中先前写入的数据无法重新读取和修改)您正在尝试做的事情可以'不工作。所以最好的解决方案(如果你的 zip 文件不会很大)是在一个临时位置创建它,readfile() 它然后删除临时文件。

请参阅以下 Stack Overflow 问题以获取更多参考。它们包含一些可能适合您的解决方法:

Zip Stream in PHP LAMP: How to create .Zip of large files for the user on the fly, without disk/CPU thrashing

【讨论】:

【参考方案2】:

尝试在readfile($zipname); 之后添加这个:

// delete the file from the server
unlink($zipname);
exit;

【讨论】:

而这个答案在2017年还是可以的。【参考方案3】:

您正在使用对象 $zip 打开和修改 zip 文件,但 filesize()readfile() 仅适用于文件名,因此您应该有这个:

header('Content-Length: ' . filesize($zipname));
readfile($zipname);

顺便说一句,您可以使用tempnam() 生成一个“临时”文件,用于保存 zip 内容;一旦readfile() 完成,你仍然需要unlink() 它。

【讨论】:

以上是关于如何使用标头php下载zip文件而不将其保存在服务器上的主要内容,如果未能解决你的问题,请参考以下文章

如何从 FTP 下载文件并使用 PHP 将其流式传输到客户端

如何在python中生成文件而不将其保存到磁盘?

在内存中创建 eml 文件而不将其保存在磁盘上

如何直接保存到持久存储,而不将数据保存到内存中

如何在不使用 Ruby 保存到磁盘的情况下生成 zip 文件?

如何流式传输从 FTP 获取的文件而不将其存储在本地?