32

我正在尝试在 PHP 中即时生成存档并立即将其发送给用户(不保存)。我认为没有必要在磁盘上创建文件,因为我发送的数据无论如何都不是持久的,但是,在搜索网络时,我无法找到方法。我也不关心文件格式。

所以,问题是:

是否可以在 php 脚本中创建和操作内存中的文件存档,而无需在此过程中创建临时文件?

4

5 回答 5

48

我遇到了同样的问题,但最终找到了一个有点晦涩的解决方案,并决定在这里分享。

我遇到了很棒的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();

此脚本允许下载 zip,而无需将文件作为真实文件或将 zip 本身保存为文件。

遗憾的是,此功能不是更通用的 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;
}

更新: CodeIgniter 项目中也提供了此代码: https://github.com/patricksavalle/CodeIgniter/blob/439ac3a87a448ae6c2cbae0890c9f672efcae32d/system/helpers/zip_helper.php

于 2012-03-10T17:27:55.367 回答
3

你用什么来生成档案?您也许可以使用流 php://temp 或 php://memory 来读写存档。

http://php.net/manual/en/wrappers.php.php

于 2009-07-27T16:11:22.460 回答
2

关于您的评论 php://temp 对您有用,除非您关闭它,尝试保持打开状态,刷新输出,然后将其倒回 0 并阅读它。

在这里查看更多示例:http ://us.php.net/manual/en/function.tmpfile.php

还研究输出缓冲和捕获:http ://us.php.net/manual/en/function.ob-start.php

于 2009-08-03T09:07:04.500 回答
0

您需要使用ZipArchive::addFromString- 如果您使用addFile()该文件,则在您关闭它之前不会实际添加该文件。(可怕的错误恕我直言,如果您尝试将文件移动到 zip 中并在关闭 zip 之前将其删除...)
addFromString()方法立即将其添加到存档中。

于 2010-10-19T08:47:56.517 回答
-7

这里真的存在性能问题,还是只是冒犯了你的正确感?许多进程写入临时文件并删除它们,并且由于缓存,它们通常从未命中磁盘。

临时文件在关闭时会自动删除。这就是它的本性。

我能想到的只有两种方法可以在内存中创建一个 zip 文件并提供它,这两种方法都可能比它们的价值更麻烦。

  • 使用内存盘。
  • 修改 ziparchive 类以添加一个方法,该方法执行 close() 方法所做的所有事情,除了实际关闭文件。(或者在 close() 中添加一个 leave-open 参数)。
    根据底层的 C 库,这甚至可能是不可能的。
于 2009-08-03T00:05:41.630 回答