将文件的内容回显给用户,但使其充当下载

时间:2010-07-27 18:49:26

标签: php

我有一个脚本,我在其中获取文件的内容,然后将其回显到屏幕,问题是它实际上将二进制文件回显到页面,我想要的是如果它的行为就像下载的那样将显示下载对话框。

我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:5)

来自PHP header()手册:


// We'll be outputting a PDF
header('Content-type: application/pdf');

// It will be called downloaded.pdf
header('Content-Disposition: attachment; filename="downloaded.pdf"');

// The PDF source is in original.pdf
readfile('original.pdf');

更改内容类型和文件名。您可以通过file_get_contents使用readfile,但要么使用,要么应该有效。

答案 1 :(得分:2)

您使用非官方但无处不在的Content-disposition标头。请参阅第一个示例here。浏览器支持文件名有一些怪癖。

您也可以简单地将Content-type标题更改为application/octet-stream,但如果没有更复杂的机制,则无法向用户建议文件名。

(注意:application/binary可能是一个比application/octet-stream好的选项,因为“如果Content-Type匹配其中一个通用值,例如application / octet-stream [...],那么很多浏览器将此视为根据上述信号对值进行二次猜测的权限,并尝试提出更具体的内容。此步骤的基本原理是,一些配置不当的Web服务器会在所有返回的内容上回退到这些类型。“来源:Google Browser Security Handbook)。

答案 2 :(得分:1)

您必须更改HTTP响应的Content-Type。

在“原始”PHP中(即不使用任何框架),它看起来像:

header("Content-Type: application/octet-stream");

在回显任何数据之前,必须在脚本开头调用它。

答案 3 :(得分:0)

感谢@Brad的回答。我已经做了一些修改。我发现如果我的内容得到回应而不需要做“readfile”。我所做的是。

header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="download.pdf"');
$pdf = $thirdPartyAPI->getPdf($ID);
echo $pdf;
ob_clean();
flush();
exit;