'无文件提取'消息,当试图提取强行下载的zip

时间:2011-02-15 09:01:19

标签: php zip archive

当我尝试从服务器中强行提取我下载的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); 

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

3 个答案:

答案 0 :(得分:1)

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

  • 尝试使用其他mimetype,例如通用application/octet-stream
  • 附加Fiddler(或任何其他HTTP调试器)并查看传输。你看到了什么?是否正在下载文件?由于某些原因,可能存在无效的Content-Length标头?
  • @middaparka在评论中指出,请勿取消readfile()的错误。

答案 1 :(得分:0)

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

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标头的事实可能无助于这种情况。)

答案 2 :(得分:0)

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