小智 13
如果您的Web服务器正在运行linux,那么您可以在没有生成临时文件的情况下进行流式处理.在win32下你可能需要使用Cygwin或类似的东西.
如果使用" - "作为zip文件名,它将压缩为stdout.从那里,使用popen()重定向该流很容易."-q"参数只是告诉zip不输出正常情况下的状态文本.有关详细信息,请参阅zip(1)联机帮助页.
<?
$zipfilename = "zip_file_name.zip";
if( isset( $files ) ) unset( $files );
$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;
}
}
header( "Content-Type: application/x-zip" );
header( "Content-Disposition: attachment; filename=\"$zipfilename\"" );
$filespec = "";
foreach( $files as $entry )
{
$filespec .= "\"$entry\" ";
}
chdir( $target );
$stream = popen( "/usr/bin/zip -q - $filespec", "r" );
if( $stream )
{
fpassthru( $stream );
fclose( $stream );
}
?>
Run Code Online (Sandbox Code Playgroud)
如果您使用的是zip扩展名,答案似乎是"不".ZipArchive类中的close方法是触发写入的方法,它似乎想要写入文件.你可能有幸使用Streams来模拟文件,但是你将整个内容保存在内存中,在完成添加文件之前你仍然无法发送它.
如果您在用户等待创建zip文件时遇到超时或其他问题,请尝试多步下载过程:
| 归档时间: |
|
| 查看次数: |
25043 次 |
| 最近记录: |