PHP:如何处理单个脚本中的文件处理和下载操作?

问题描述:

在一个脚本,我需要做到以下几点:PHP:如何处理单个脚本中的文件处理和下载操作?

  1. 创建一个ZIP出文件的目录中
  2. 力新创建的压缩的下载

我的问题是,每当我尝试在单个脚本中执行此操作时,下载的zip文件已损坏(虽然文件大小不错)。如果我在两个独立的脚本调用中触发 进程,则下载的zip文件可以正常使用。

我想问题是压缩保存到文件进程并不完全是 在下载开始之前完成。奇怪的是,它并没有解决问题 之间插入睡眠(3)...下面的代码大纲。

如何确保zip文件在强制下载开始之前完全完成?

祺/乔纳斯

// 1. create a zip 
$createZipFile = new CreateZipFile('temp.zip'); 
$createZipFile->zipDirectory('temp/', '.'); 
$createZipFile->saveZipFile(); 

sleep(3); // <-- Doesn't matter! 

// 2. force zip download 
$fileServer = new FileServer(); 
// Line below gives a corrupted zip when run in same script as 1.  
$fileServer->forzeDownload('temp.zip'); 
+2

尝试在文本编辑器中打开损坏的zip文件 - 它可能会揭示出现问题的地方。有可能它只包含一个404页(显然这不是一个格式正确的zip文件)。 – JorenB 2009-08-23 10:43:27

+0

您可能会有一些额外的输出(可能是PHP块之前的单个空格/换行符),这会损坏您的数据。 – Gumbo 2009-08-23 10:46:19

谢谢JorenB和浓汤! texteditor检查发现一些调试输出在zip创建中,不会影响标准zip,但是会在下载时破坏发送到浏览器的数据。

创建ZIP,然后将用户重定向到该文件。

http://php.net/manual/en/function.header.php

+0

谢谢安东尼奥,但在这种情况下,我必须在一个过程中做到这一点...... – Cambiata 2009-08-23 10:55:26

+0

你正在一个过程中做到这一点。您已经创建了该文件,只需使用标题来传递适当的标题即可下载文件,然后使用readfile。或者简单地将用户重定向到zip文件(这简单得多) – AntonioCS 2009-08-23 20:27:30

+0

如果你这样做,那么不要忘记实施某种解决方案,删除已经提供服务的文件。 – 2009-08-24 14:20:42