PHP中的Zip流

23

我有一个 PHP 脚本,可以实时创建 ZIP 文件并强制浏览器下载该文件。问题是:我是否可以将 ZIP 文件直接写入与用户浏览器连接的输出流中,而不是先将其保存为真实的服务器文件然后再发送文件?

提前致谢。


2
这个问题的答案在这里:https://dev59.com/mW855IYBdhLWcg3waDiR#4357904 - Lee
5个回答

16

如果您的 Web 服务器正在运行 Linux,则可以在不生成临时文件的情况下进行流式传输。在 Win32 下,您可能需要使用 Cygwin 或类似软件。

如果您将 - 作为压缩文件名,则它将压缩到 STDOUT。这可以直接重定向到使用 passthru() 的请求者。 -q 参数只是告诉 zip 不输出它通常会输出的状态文本。有关更多信息,请参见 zip(1) 手册页。

$zipfilename = 'zip_file_name.zip';

$files = array();

$target = '/some/directory/of/files/you/want/to/zip';

$d = dir( $target );

while( false !== ( $entry = $d->read() ) )
{
    if( substr( $entry, 0, 1 ) != '.' && !is_dir( $entry ) ) 
    {
        $files[] = $entry;
    }
}

if( ! $files )
{
    exit( 'No files to zip.' );
}

header( 'Content-Type: application/x-zip' );
header( "Content-Disposition: attachment; filename=\"$zipfilename\"" );

$filespec = '';

foreach( $files as $entry )
{
    $filespec .= ' ' . escapeshellarg( $entry );
}

chdir( $target );

passthru( "zip -q -$filespec" );

14

5
如果您正在使用zip扩展程序,答案似乎是否定的。ZipArchive类中的close方法会触发写操作,它似乎想要写入文件。您可以尝试使用来模拟文件,但这样会将整个内容存储在内存中,而且直到添加完所有文件后才能发送。
如果在等待zip文件创建时出现超时或其他问题,请尝试多步下载过程:
1. 用户选择创建zip的内容。 2. 他们被带到一个状态页面,该页面使用ajax调用在后台实际构建zip文件。漂亮、分散注意力的动画应该吸引他们的注意力。 3. 在后台进程构建zip之后,用户将被重定向到执行下载/重定向到文件的脚本。

1

-2

不,你必须使用临时文件,就像这里一样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接