如何使用标头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 将其流式传输到客户端