使用PHP强制下载文件的问题

时间:2011-06-13 10:57:26

标签: php http-headers

强制浏览器下载文件时遇到问题。我找到了解决问题的方法:

header("Content-type: application/force-download");
header("Content-Disposition: attachment; filename=$name_of_file");
header("Pragma: no-cache");
header("Expires: 0");
readfile($name_of_file);
exit;

但之后我在屏幕上显示了我的文件。即使这样也会产生同样的结果:

header('content-type: text/xml');
header('Content-Disposition: attachment;filename="$filename"');
echo "TEST";
exit;

哪里可能有问题?

3 个答案:

答案 0 :(得分:2)

不幸的是,Content-Disposition header field附件不受支持。这就是Content-Type header field value is more important

的原因
  

如果在具有application / octet-stream内容类型的响应中使用[Content-Disposition]标头,则隐含的建议是用户代理不应显示响应,而是直接输入`save response as。 ..'对话。

虽然unknown content type like application/force-download应该被解释为application/octet-stream

  

预计将来会定义“应用程序”的许多其他子类型。 MIME实现必须至少将任何无法识别的子类型视为等同于“application / octet-stream”。

但你最好安全地玩它并明确地使用 application / octet-stream

答案 1 :(得分:1)

<?php
header("Content-Type: application/octet-stream");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize($name_of_file));
header("Content-disposition: attachment; filename=" . $name_of_file);
readfile($name_of_file);
die();

1)您有责任确保文件确实存在且可读

2)在发送标题之前添加ob_end_clean();可能值得(如果您已经发送了一些内容)

编辑:根据porneL,thnx的评论删除了无用的;

答案 2 :(得分:0)

只需使用:

header('Content-Disposition: attachment');

并将其与mod_rewrite等结合使用,将正确的文件名放入网址

如果你有Apache,但你没有使用mod_rewrite,那也可以;

http://example.com/download_script.php/nice_filename.xml

这会导致download_script.php被调用。浏览器会“看到”nice_filename.xml作为文件名,您不需要非常混乱且不可靠的filename=…属性。