PHP ZIP文件在飞行中

从服务器上的文件夹压缩2个文件并强制下载最简单的方法是什么? 不要将“zip”保存到服务器。

$zip = new ZipArchive(); //the string "file1" is the name we're assigning the file in the archive $zip->addFile(file_get_contents($filepath1), 'file1'); //file 1 that you want compressed $zip->addFile(file_get_contents($filepath2), 'file2'); //file 2 that you want compressed $zip->addFile(file_get_contents($filepath3), 'file3'); //file 3 that you want compressed echo $zip->file(); //this sends the compressed archive to the output buffer instead of writing it to a file. 

有人可以validation:我有一个文件夹test1.doc,test2.doc和test3.doc

与上面的例子 – file1(file2和file3)可能只是test1.doc,等等

我需要做什么“$ filepath1”? 这是包含3个文档的文件夹目录吗?

对不起,我的基本问题..

不幸的是,在CentOS 5.x上使用PHP 5.3.4-dev和Zend Engine v2.3.0,我无法获得上面的代码。 我无法得到“ 无效的或单元化的Zip对象 ”错误信息。 因此,为了使它工作,我不得不使用下面的代码片段(从PHP.net手册Jonathan Baltazar的例子,在ZipArchive ::打开页面):

 // Prepare File $file = tempnam("tmp", "zip"); $zip = new ZipArchive(); $zip->open($file, ZipArchive::OVERWRITE); // Stuff with content $zip->addFromString('file_name_within_archive.ext', $your_string_data); $zip->addFile('file_on_server.ext', 'second_file_name_within_archive.ext'); // Close and send to users $zip->close(); header('Content-Type: application/zip'); header('Content-Length: ' . filesize($file)); header('Content-Disposition: attachment; filename="file.zip"'); readfile($file); unlink($file); 

我知道这不同于只有工作记忆 – 除非你有你的tmp领域的内存 – – 但也许这可以帮助别人,谁在上面的解决scheme挣扎,像我一样; 而对于哪个性能惩罚不是问题。

你的代码非常接近。 您需要使用文件名称而不是文件内容。

 $zip->addFile(file_get_contents($filepath1), 'file1'); 

应该

 $zip->addFile($filepath1, 'file1'); 

http://us3.php.net/manual/en/function.ziparchive-addfile.php

如果您需要从variables而不是文件添加文件,则可以使用addFromString函数。

 $zip->addFromString( 'file1', $data ); 

如果你有权访问zip命令行工具,你可以试试

 <?php $zipped_data = `zip -q - files`; header('Content-type: application/zip'); header('Content-Disposition: attachment; filename="download.zip"'); echo $zipped_data; ?> 

其中文件是你想压缩的东西,并将位置压缩到zip可执行文件。

当然,这是假设Linux或类似的。 在Windows中,你可能能够做类似的另一个压缩工具,我猜。

还有一个zip扩展名 , 这里显示的用法。

maraspin的答案是我所尝试的。 奇怪的是,我通过删除引用文件大小的标题行来得到它的工作:

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

随着上述变化,代码工作就像一阵轻风! 没有这个变化,我曾经得到以下错误信息:

未find中央目录签名末尾。 这个文件不是一个zip文件,或者它构成一个多部分档案的一个磁盘。 在后一种情况下,中央目录和zipfile注释将在该存档的最后一个磁盘上find。

testing环境:

操作系统:Ubuntu 10.10浏览器:Firefox和默认的LAMP堆栈。

itsols如果你想插入“Content-Length”,就这样做:

 $length = filesize($file); header('Content-Length: ' . $length); 

我不知道为什么,但如果你把它放在同一行,就会崩溃。

要快速创buildZIP文件(在内存中),可以使用phpMyAdmin中的 ZipFile类:

  • PMA \库\ ZipFile.php

一个如何在你自己的应用程序中使用它的例子:

注意:您的ZIP文件将受到PHP内存限制的限制,如果超出限制,将导致归档文件损坏。