我有一个脚本,我在其中获取文件的内容,然后将其回显到屏幕,问题是它实际上将二进制文件回显到页面,我想要的是如果它的行为就像下载的那样将显示下载对话框。
我怎样才能做到这一点?
答案 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;