我试图生成存档在PHP上的飞,并立即发送给用户(但不保存)。 我想,就没有必要在磁盘上,我要送的数据创建一个文件是不是持久的,无论如何,然而,在网上搜索,我找不到如何。 我也不在乎的文件格式。
所以,问题是:
是否有可能创建和操作一个PHP脚本内存储器中的文件归档,而无需创建沿途临时文件?
我试图生成存档在PHP上的飞,并立即发送给用户(但不保存)。 我想,就没有必要在磁盘上,我要送的数据创建一个文件是不是持久的,无论如何,然而,在网上搜索,我找不到如何。 我也不在乎的文件格式。
所以,问题是:
是否有可能创建和操作一个PHP脚本内存储器中的文件归档,而无需创建沿途临时文件?
我有同样的问题,但终于找到了一个有点模糊的解决方案,并决定在这里分享。
我来翻过大zip.lib.php
/ unzip.lib.php
它配备了脚本phpmyadmin
和位于“库”目录。
使用zip.lib.php
担任魅力对我来说:
require_once(LIBS_DIR . 'zip.lib.php');
...
//create the zip
$zip = new zipfile();
//add files to the zip, passing file contents, not actual files
$zip->addFile($file_content, $file_name);
...
//prepare the proper content type
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=my_archive.zip");
header("Content-Description: Files of an applicant");
//get the zip content and send it back to the browser
echo $zip->file();
这个脚本允许拉链的下载,而不需要具有文件作为真正的文件或保存拉链本身作为一个文件。
这是一个耻辱,这个功能是不是更通用的PHP库的一部分。
下面是该链接zip.lib.php
从phpMyAdmin的源文件: https://github.com/phpmyadmin/phpmyadmin/blob/RELEASE_4_5_5_1/libraries/zip.lib.php
更新:确保你从zip.lib.php的开始删除以下支票否则脚本只是终止:
if (! defined('PHPMYADMIN')) {
exit;
}
更新:该代码可从笨项目,以及: https://github.com/patricksavalle/CodeIgniter/blob/439ac3a87a448ae6c2cbae0890c9f672efcae32d/system/helpers/zip_helper.php
你在使用生成的存档? 您可能能够使用流PHP://临时或php://内存读取和存档写入/。
见http://php.net/manual/en/wrappers.php.php
关于你的评论在PHP://临时为你工作,当你关闭它除了,尽量保持它打开,刷新输出,然后倒带回到0和阅读。
在这里寻找更多的例子: http://us.php.net/manual/en/function.tmpfile.php
同时研究输出缓冲和捕获: http://us.php.net/manual/en/function.ob-start.php
您需要使用ZipArchive::addFromString
-如果你使用addFile()
的文件实际上并未添加,直到你去关闭它。 (可怕的错误恕我直言,如果你想什么文件移动到一个zip和删除它们在关闭前拉链......)
该addFromString()
方法会立即添加到档案文件。
是否真的有性能问题在这里,还是只是得罪你的正当性的意义吗? 很多进程写入临时文件并删除它们,而且往往他们从来没有击中磁盘因缓存。
封闭时临时文件被自动删除。 这是它的本质。
只有两种办法我能想到的在内存中创建一个zip文件和服务,并都可能是更多的麻烦比他们的价值。