我想能够存档(zip,不需要压缩,但这是加号),
在内存和流中,问题是我想在
中创建一个内部拉链 我正在流式流的拉链,就像:
文件:
a.txt, b.txt, c.txt
流下载应该看起来像:
my.zip {
a.txt
inner.zip {
b.txt, c.txt
}
}
注意,我必须流式传输文件,因为我有没有可用的HD存储和i 无法在内存中拥有所有文件>流式传输)
这是我设法工作的普通拉链流(还没有内部邮递流):
<?php
require 'ZipStream.php';
$zip = new ZipStreamZipStream('my.zip');
$zip->addFileFromPath('a.txt', 'a.txt');
// I want to add inner.zip here and stream it too only from memory
$zip->finish();
您可以运行一个小示例,以查看使用ZipArchive
是否可以为您提供帮助。在示例的根目录中创建3个名为a,b,c
的空.txt
文件。
php
function RandomString($file)
{
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ';
$randstring = file_get_contents($file);
for ($i = 0; $i < 2000000; $i++) {
$randstring .= $characters[rand(0, strlen($characters))];
}
file_put_contents($file,$randstring);
return true;
}
// fill the 3 files with data up to 2Mb per run
RandomString("a.txt");
RandomString("b.txt");
RandomString("c.txt");
$zip = new ZipArchive;
$res = $zip->open('inner.zip', ZipArchive::CREATE);
if ($res === TRUE) {
$zip->addFile('b.txt', 'b.txt');
$zip->addFile('c.txt', 'c.txt');
$zip->close();
$resMy = $zip->open('my.zip', ZipArchive::CREATE);
if ($resMy === TRUE) {
$zip->addFile('a.txt', 'a.txt');
$zip->addFile('inner.zip', $contents);
$zip->close();
unlink('inner.zip');
$file_name = basename("my.zip");
header("Content-Type: application/zip");
header("Content-Disposition: attachment; filename=$file_name");
header("Content-Length: " . filesize("my.zip"));
readfile("my.zip");
unlink("my.zip");
exit;
} else {
echo 'failed to create my.zip';
}
} else {
echo 'failed to create inner.zip';
}
在3个文件中测试了上面的示例,对于 55MB的数据输出是a <〜300KB的邮政编码 。
好吧,这种作品。我想发布它,尽管我决定以另一种方式解决问题。但是,仅供将来参考,这可能对某人有帮助。
<?php
$zip_header_outer = "x1fx8bx08x08ixbbxb9Xx00xffinner.zipx00";
$zip_header_inner = "x1Fx8Bx08x08x69xBBxB9x58x00xFF";
$compression_level = 0;
$download_headers = true;
$download_file_name = 'my.zip';
$inner_file_name = 'inner.zip';
$first_level_file = 'a.txt';
$second_level_file = 'b.txt';
$fout = fopen("php://output", "wb");
if ($fout === FALSE) {
die('Problem outputting');
}
if ($download_headers) {
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename="" . $download_file_name . """);
}
function add_to_inner_zip($filename, $path, &$fout, &$fsize_outer, &$hctx_outer) {
$zip_header_inner = "x1Fx8Bx08x08x69xBBxB9x58x00xFF";
fwrite($fout, $zip_header_inner);
hash_update($hctx_outer, $zip_header_inner);
$fsize_outer += strlen($zip_header_inner);
$hctx_inner = hash_init("crc32b");
$fsize_inner = 0;
// Inner Add file name
$file_name = str_replace("