【问题标题】:'no files to extract' message, when trying to extract zip which was downloaded forcefully“没有要提取的文件”消息,当尝试提取强制下载的 zip 文件时
【发布时间】:2011-02-15 09:01:18
【问题描述】:

当我尝试强行提取从服务器下载的 zip 文件夹时,我收到消息“没有要提取的文件”。但是当我直接从服务器下载 zip 文件夹时,我可以正确解压它。这是我用来强制下载的代码。

$file = 'absolute/path/to/the/zip/folder';
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header( "Content-Disposition: attachment; filename=".basename($file));
header( "Content-Description: File Transfer");
@readfile($file); 

有人知道为什么会这样吗?任何帮助,将不胜感激。提前致谢

【问题讨论】:

  • 抑制读取文件上的错误可能是不明智的。

标签: php zip archive


【解决方案1】:

我无法回答这个问题,但这里有一些想法可以尝试:

  • 尝试不同的 mimetype,例如通用 application/octet-stream
  • 附加 Fiddler(或任何其他 HTTP 调试器)并查看传输。你看到了什么?文件正在下载吗?也许出于某种原因存在无效的 Content-Length 标头?
  • 正如 @middaparka 在 cmets 中所指出的,不要抑制来自 readfile() 的错误。

【讨论】:

  • 我尝试使用 'octet-stream',但没有找到任何解决方案。正如@middaprka 所说,我删除了压制。都没有帮助。谢谢你的回答。
  • @ksun - 你在 Fiddler 中看到了什么?也许您可以将保存的“会话”发送给我们?
【解决方案2】:

很难判断这是由于您使用的标头还是服务器问题。但是,我通常使用以下内容没有任何问题:

header("Cache-Control: private");
header("Content-Type: application/stream");
header("Content-Length: ".filesize($file));
header("Content-Disposition: attachment; filename=".basename($file));

readfile($file);
exit();

因此,您可能想尝试上述方法,看看是否有任何不同。 (猜测一下,如果您的连接速度很慢,那么您没有提供 Content-Length 标头这一事实可能无济于事。)

【讨论】:

  • 我试过你的代码,但问题没有解决。我认为这不是服务器问题,因为我可以直接从服务器下载 zip。谢谢你的回答。
  • @ksun 我的代码在各种服务器上都能正常工作,因此我不得不怀疑这是否是服务器问题。您是否按照@Vilx- 的建议检查了从响应中返回的标头? (您可以使用 Firebug 等来执行此操作。)
  • 我会和 fiddler 核对并告诉你
【解决方案3】:

感谢大家的支持。我找到了解决方案。我在发送标头之前使用了 mkdir 函数。似乎这产生了一些错误,因此在标题之前输出了错误,从而导致了问题。当我使用“@”运算符抑制错误时,问题就解决了。 :)。早些时候,我从 fiddler 收到以下消息:“Fiddler 在会话 #4 中检测到协议违规。服务器没有返回格式正确的 HTTP 标头。可能完全丢失(例如 HTTP/0.9),可能只有 \r\r 而不是\r\n\r\n?”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 2017-08-21
    相关资源
    最近更新 更多