如何强制文件在浏览器中打开而不是下载(PDF)?

时间:2011-06-09 13:54:45

标签: pdf http-headers browser embed embedding

当取消选中“在浏览器中显示PDF”选项时,有没有办法强制PDF文件在浏览器中打开?

我尝试使用embed标记和iframe,但只有在选中该选项时才有效。

我该怎么办?

15 个答案:

答案 0 :(得分:353)

向浏览器表明应该在浏览器中查看该文件:

Content-Type: application/pdf
Content-Disposition: inline; filename="filename.pdf"

要下载文件而不是查看文件:

Content-Type: application/pdf
Content-Disposition: attachment; filename="filename.pdf"

如果文件名包含特殊字符(如filename[1].pdf),则文件名周围的引号是必需的,这可能会破坏浏览器处理响应的能力。

答案 1 :(得分:21)

如果您使用的是HTML5(我想现在每个人都使用HTML5),则会有一个名为download的属性。

例如,

<a href="somepathto.pdf" download="filename">

此处filename是可选的,但如果提供,则会为下载的文件使用此名称。

答案 2 :(得分:15)

PDF的正确类型为application/pdf,而不是application/force-download。这看起来像是一些传统浏览器的黑客攻击。如果可以,请始终使用正确的mimetype。

如果您可以控制服务器代码:

  • 强制下载/提示:使用header("Content-Disposition", "attachment; filename=myfilename.myextension");
  • 浏览器尝试打开它:使用header("Content-Disposition", "inline; filename=myfilename.myextension");

无法控制服务器代码:

注意:我更喜欢在服务器端设置文件名,因为您可能有更多信息并且可以使用公共代码。

答案 3 :(得分:4)

如果你有Apache将其添加到.htaccess文件:

<FilesMatch "\.(?i:pdf)$">
    ForceType application/octet-stream
    Header set Content-Disposition attachment
</FilesMatch>

答案 4 :(得分:2)

哎呀,我上一篇文章中有输入错误。

    header("Content-Type: application/force-download");
    header("Content-type: application/pdf");
    header("Content-Disposition: inline; filename=\"".$name."\";");

如果您不希望浏览器提示用户,请使用&#34;内联&#34;对于第三个字符串而不是&#34;附件&#34;。内联工作非常好。 PDF会立即显示,而不会要求用户单击“打开”。我已经使用了&#34;附件&#34;这将提示用户打开,保存。我试图更改浏览器设置螺母,但它不会阻止提示。

答案 5 :(得分:0)

这适用于ASP.NET MVC

在您的cshtml页面中:

<section>
    <h4><a href="@Url.Action("Download", "Document", new { id = @Model.GUID })"><i class="fa fa-download"></i> @Model.Name</a></h4>
    <object data="@Url.Action("View", "Document", new { id = @Model.GUID })" type="application/pdf" width="100%" height="800" class="col-md-12">
        <h2>Your browser does not support viewing PDFs, click on the link above to download the document.</h2>
    </object>
</section>

在您的控制器中:

public ActionResult Download(Guid id)
    {
        if (id == Guid.Empty)
            return null;

        var model = GetModel(id);

        return File(model.FilePath, "application/pdf", model.FileName);
    }

public FileStreamResult View(Guid id)
    {
        if (id == Guid.Empty)
            return null;

        var model = GetModel(id);

        FileStream fs = new FileStream(model.FilePath, FileMode.Open, FileAccess.Read);

        return File(fs, "application/pdf");
    }

答案 6 :(得分:0)

我遇到了同样的问题以上大部分答案都应该可以解决您的问题。不幸的是,即使我在响应中收到内容类型和内容处置标头,但我的 pdf 仍然被下载而不是查看。经过头脑风暴和数小时的尝试。

<块引用>

罪魁祸首是firefox,在某种程度上它是。紧张的笑声

默认,当您在 Firefox 中打开 pdf 文件时,它会为您提供一个弹出窗口,您可以保存 pdf 文件直接打开它还有一个复选框,上面写着从现在开始自动执行此操作并猜猜是谁选择了它。

由于这个错误,我的 pdf 被下载而不是查看,即使有所有必需的响应标题。这是一个简单的错误,但花费了我很多时间。

要解决此问题,只需转到设置搜索应用程序,然后将 pdf 设置更改为您需要的任何内容。

答案 7 :(得分:-1)

如果您使用的是CodeIgniter。

请设置:

$htmlpdf -> Output($pdf_local_path, f); to $htmlpdf -> Output(); exit;

答案 8 :(得分:-1)

虽然以下内容在firefox上运行良好,但在chrome浏览器和移动浏览器上不起作用。

Content-Type: application/pdf
Content-Disposition: inline; filename="filename.pdf"

要修复Chrome和移动浏览器错误,请执行以下操作:

  • 将文件存储在项目的目录中
  • 使用google PDF查看器

Google PDF Viewer可以这样使用:

<iframe src="http://docs.google.com/gview?url=http://example.com/path/to/my/directory/pdffile.pdf&embedded=true" frameborder="0"></iframe>

答案 9 :(得分:-2)

您可以通过以下方式执行此操作:

<a href="path to PDF file">Open PDF</a>

如果PDF文件位于某个文件夹中,并且该文件夹没有直接访问该文件夹中文件的权限,则必须通过以下方式使用.htaccess文件设置绕过某些文件访问限制:

<FilesMatch ".*\.(jpe?g|JPE?G|gif|GIF|png|PNG|swf|SWF|pdf|PDF)$" >
    Order Allow,Deny
    Allow from all
</FilesMatch>

但现在只允许某些必要的文件。

我使用过这段代码,效果很好。

答案 10 :(得分:-2)

从rootfile打开downloads.php。

然后转到第186行并将其更改为以下内容:

        if(preg_match("/\.jpg|\.gif|\.png|\.jpeg/i", $name)){
            $mime = getimagesize($download_location);
            if(!empty($mime)) {
                header("Content-Type: {$mime['mime']}");
            }
        }
        elseif(preg_match("/\.pdf/i", $name)){
            header("Content-Type: application/force-download");
            header("Content-type: application/pdf");
            header("Content-Disposition: inline; filename=\"".$name."\";");
        }

        else{
            header("Content-Type: application/force-download");
            header("Content-type: application/octet-stream");
            header("Content-Disposition: attachment; filename=\"".$name."\";");
        }

答案 11 :(得分:-4)

使用

<embed src="file.pdf" />

如果嵌入是一个选项或我的新插件,PIFF:https://github.com/terrasoftlabs/piff

答案 12 :(得分:-5)

这是在PHP中强制文件在浏览器中查看的另一种方法:

$extension = pathinfo($file_name, PATHINFO_EXTENSION);
$url = 'uploads/'.$file_name;
        echo '<html>'
                .header('Content-Type: application/'.$extension).'<br>'
                .header('Content-Disposition: inline; filename="'.$file_name.'"').'<br>'
                .'<body>'
                .'<object   style="overflow: hidden; height: 100%;
             width: 100%; position: absolute;" height="100%" width="100%" data="'.$url.'" type="application/'.$extension.'">
                    <embed src="'.$url.'" type="application/'.$extension.'" />
             </object>'
            .'</body>'
            . '</html>';

答案 13 :(得分:-7)

只需打开Adobe Reader,菜单→编辑首选项 Internet ,然后更改为浏览器模式或有关不同浏览器的详细说明尝试 Display PDF in browser | Acrobat, Acrobat Reader

答案 14 :(得分:-9)

如果您链接到.PDF,它将在浏览器中打开 如果未选中此框,则应链接到.zip以强制下载。

如果.zip不是一个选项,那么在PHP中使用headers强制下载

header('Content-Type: application/force-download'); 
header('Content-Description: File Transfer');