【问题标题】:Php: How to handle file processing and download operations in a single script?Php:如何在单个脚本中处理文件处理和下载操作?
【发布时间】:2010-11-22 00:58:23
【问题描述】:

在单个脚本中,我需要执行以下操作:

  1. 从目录中的文件创建一个 zip 文件
  2. 强制下载新创建的 zip

我的问题是,每当我尝试在单个脚本中执行此操作时, 下载的 zip 已损坏(文件大小还可以)。如果我触发 在两个单独的脚本调用中处理,下载的 zip 就可以了。

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

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

问候 / 乔纳斯

// 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'); 

【问题讨论】:

  • 尝试在文本编辑器中打开损坏的 zip 文件 - 它可能会揭示出问题所在。很可能它只包含一个 404 页(显然,它不是一个格式正确的 zip 文件)。
  • 您可能有一些额外的输出(可能在 PHP 块之前有一个空格/换行符)会损坏您的数据。

标签: php zip archive


【解决方案1】:

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

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

【讨论】:

  • 您是在一个进程中完成的。您已经创建了文件,只需使用标头传递适当的标头以下载文件,然后使用 readfile。或者只是将用户重定向到 zip 文件(这要简单得多)
  • 如果你这样做了,那么不要忘记实施某种解决方案来删除已经提供的文件。
【解决方案2】:

谢谢 JorenB 和 Gumbo! 文本编辑器检查显示 zip 创建中的一些调试输出不会影响原始 zip,但会破坏下载时发送到浏览器的数据。

【讨论】:

    猜你喜欢
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 2022-10-02
    相关资源
    最近更新 更多