在PHP中设置的内容处置标头不适用于Firefox

时间:2009-12-17 20:10:34

标签: php apache pdf mime-types content-disposition

我有一个表单按钮,将数据提交到通用脚本(从表单加载的同一页面,index.php),如果正确的POST变量提交到该脚本,它会返回一个PDF给用户打印(加载了相关的表单信息,以及其他数据库信息等)。

问题在于,无论我在标题中设置内容类型和内容处置,Firefox都会提示用户保存或打开文档。

如果Firefox将其自己的Adobe Reader插件作为“打开方式”选项提供,那就不会那么糟糕了,但它只提供实际的Adobe Reader应用程序(由于身份验证和默认浏览器设置导致我的问题控制等)。

因此,我需要更改服务器端(在.htaccess文件或实际标头中)以使Firefox获得响应是带有application / pdf MIME Type的PDF的消息,因此应该对待文件,好像它是PDF的硬链接,而不是服务器生成的流?

最后一件事......

如果我将Content-Disposition设置为“inline”Firefox会在Firefox中打开文件,但只能在首先将页面加载为“index.php”之前。一旦用户访问PDF,如果他们尝试单击后退按钮,他们会点击加载PDF的index.php,而不是他们提交数据的那个。在Mac方面,Firefox不会加载PDF,而是提示用户保存或打开“index.php”,就好像它是附件一样。

谢谢!


目前我尝试的代码(按此顺序):

这个被视为文件附件,因此对于文件扩展规则忽略Firefox的Mime-Type规则:

    header("Content-Type: application/pdf");
    header('Content-Disposition:attachment; filename="testing.pdf"');

这个工作但首先加载index.php然后加载文件,这是没有吸引力,令人困惑,并在pdf和原始页面之间添加额外的请求(因此是一个额外的页面):

    header("Content-Type: application/pdf");
    header('Content-Disposition:inline; filename="testing.pdf"');

此处理方式与attachment(在Firefox中)相同,因此仅提示在Adobe Reader中保存或打开,而不是默认为Adobe Reader插件:

    header("Content-Type: application/pdf");
    header('Content-Disposition:pdf; filename="testing.pdf"');

另请注意,在上一个示例中,我尝试了pdfapplication\pdf作为内容处置。没有区别。

我还没有尝试过的唯一一个是将类型设置为ocet / stream。我会越过我的手指,但不会屏住呼吸。

3 个答案:

答案 0 :(得分:1)

您可以尝试将链接以“.pdf”结尾,并使用类似mod_rewrite的内容将其映射到PHP脚本。

答案 1 :(得分:0)

我认为Firefox很难处理PDF作为对POST的响应,您是否可以尝试生成PDF链接并让他们点击链接,链接可能包含GET变量,如blah。 php?VAR = 123所以你仍然可以动态生成PDF。

答案 2 :(得分:-1)

mime-type application/octet-stream应该强制浏览器下载它。我不知道这是你想要的帖子。