我正在尝试在 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();
此脚本允许下载 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
你用什么来生成档案?您也许可以使用流 php://temp 或 php://memory 来读写存档。
关于您的评论 php://temp 对您有用,除非您关闭它,尝试保持打开状态,刷新输出,然后将其倒回 0 并阅读它。
在这里查看更多示例:http ://us.php.net/manual/en/function.tmpfile.php
还研究输出缓冲和捕获:http ://us.php.net/manual/en/function.ob-start.php
您需要使用ZipArchive::addFromString
- 如果您使用addFile()
该文件,则在您关闭它之前不会实际添加该文件。(可怕的错误恕我直言,如果您尝试将文件移动到 zip 中并在关闭 zip 之前将其删除...)
该addFromString()
方法立即将其添加到存档中。
这里真的存在性能问题,还是只是冒犯了你的正确感?许多进程写入临时文件并删除它们,并且由于缓存,它们通常从未命中磁盘。
临时文件在关闭时会自动删除。这就是它的本性。
我能想到的只有两种方法可以在内存中创建一个 zip 文件并提供它,这两种方法都可能比它们的价值更麻烦。