我正在尝试在PHP中动态生成归档文件,并立即将其发送给用户(无需保存)。我想,既然我发送的数据是非持久性的,就没有必要在磁盘上创建文件,但是,在搜索网络时,我找不到如何实现。我也不关心文件格式。
所以问题是:
是否可以在PHP脚本中在内存中创建和操作文件归档,而不沿途创建临时文件?
我正在尝试在PHP中动态生成归档文件,并立即将其发送给用户(无需保存)。我想,既然我发送的数据是非持久性的,就没有必要在磁盘上创建文件,但是,在搜索网络时,我找不到如何实现。我也不关心文件格式。
所以问题是:
是否可以在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();
if (! defined('PHPMYADMIN')) {
exit;
}
更新:
这段代码也可以在CodeIgniter项目中找到:
https://github.com/patricksavalle/CodeIgniter/blob/439ac3a87a448ae6c2cbae0890c9f672efcae32d/system/helpers/zip_helper.php
ZipArchive::addFromString
- 如果你使用 addFile()
,文件直到你关闭它之前才会被添加。(在我看来这是个可怕的错误,如果你试图将文件移动到 zip 中并在关闭 zip 之前删除它们,那该怎么办呢...)addFromString()
方法会立即将其添加到归档中。这里真的存在性能问题吗,还是只是触犯了你的正义感?很多进程会写入临时文件并删除它们,通常由于缓存,它们永远不会被写入磁盘。
当关闭时,临时文件会自动删除。这就是它的本质。
我只能想到两种在内存中创建zip文件并提供服务的方法,但它们可能都不值得麻烦。