http头-使用PHP强制下载文件时出现问题



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

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;

哪里可能有问题?

不幸的是,Content-Disposition头字段的附件不受支持。这就是内容类型标题字段值更重要的原因:

如果在应用程序/八位位组流内容类型的响应中使用了[内容处置]标头,则隐含的建议是用户代理不应显示响应,而是直接输入"将响应另存为…"对话框。

尽管像应用程序/强制下载这样的未知内容类型应该被解释为像application/octet流

预期许多其它亚型的";应用程序";将在未来进行定义。MIME实现必须至少将任何未识别的子类型视为等同于"MIME";应用程序/八位位组流";。

但您应该更安全地使用application/octet stream

<?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 的注释删除了无用的;

只需使用:

header('Content-Disposition: attachment');

并将其与CCD_ 3等组合以在URL中放入正确的文件名

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

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

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

相关内容

  • 没有找到相关文章

最新更新