强制浏览器下载文件时遇到问题。我找到了解决问题的方法:
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;
哪里可能有问题?
答案 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=…
属性。