我有一个 PHP 脚本,可以实时创建 ZIP 文件并强制浏览器下载该文件。问题是:我是否可以将 ZIP 文件直接写入与用户浏览器连接的输出流中,而不是先将其保存为真实的服务器文件然后再发送文件?
提前致谢。
如果您的 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" );