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

当“在浏览器中显示PDF”选项未选中时,是否有一种方法强制PDF文件在浏览器中打开?

我尝试使用嵌入标签和一个iframe,但它只有当该选项被选中时才会工作。

我该怎么办?

423751 次浏览

如果你链接到一个。pdf,它将在浏览器中打开 如果这个框未选中,它应该链接到一个。zip文件来强制下载

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

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

要么使用

<embed src="file.pdf" />

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

为了向浏览器指示该文件应该在浏览器中查看,HTTP 响应应该包括以下头文件:

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

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

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

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

如何设置HTTP响应标头取决于您的HTTP服务器(或者,如果您从服务器端代码生成PDF响应,则需要使用服务器端编程语言)。

你可以通过以下方式做到这一点:

<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>

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

我已经使用了这段代码,它工作得很完美。

(我误解了问题,下面的答案是关于强制下载文件而不是在浏览器中打开文件)

如果你正在使用HTML5(我猜现在每个人都在使用HTML5),有一个名为download的属性。

例如,

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

这里filename是可选的,但如果提供了,它将为下载的文件取此名称。

编辑

我知道这和问题的答案正好相反。我为那些(像我一样)寻找相反问题的人保留了相反的答案(证据:这个答案的赞票比反对票多)

从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."\";");
}

哎呀,我上一篇文章中有打字错误。

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

如果你不想让浏览器提示用户,那就用"inline"代替"attachment"作为第三个字符串。内联工作得很好。PDF立即显示,而不需要用户单击“打开”。我使用了“附件”,这将提示用户打开,保存。我尝试改变浏览器设置螺母,它不能阻止提示。

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

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

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

无法控制服务器代码:

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

下面是在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>';

如果你有Apache,把这个添加到.htaccess文件中:

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

这是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");
}

虽然下面的工作很好在firefox,它不工作在chrome和移动浏览器。

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

固定铬&移动浏览器出现错误时,请执行以下操作:

  • 将文件存储在项目中的某个目录中
  • 使用谷歌PDF查看器

谷歌PDF查看器可以这样使用:

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

我有同样的问题和大部分以上答案应该可以解决你的问题。不幸的是,即使我是接收内容类型&附加头在响应但但我的PDF文件还是被下载了,而不是被浏览了。经过几个小时的头脑风暴和尝试。

罪犯是火狐,在某种程度上是。紧张的笑声

默认情况下,当你在firefox中打开一个pdf文件时,它会为你提供一个弹出的保存PDF文件直接打开,还有一个复选框,上面写着从现在开始自动执行这个动作吗,猜猜谁选择了它。

由于这个错误,我的PDF文件被下载而不是被查看,即使有响应中的所有必需的头文件. c。这是一个简单的错误,但花费了我大量的时间。

要解决这个问题,只需进入设置搜索应用程序更改PDF设置为任何您需要的。

对于大文件,你需要让你的输出缓冲区开始添加

ob_start(); //在开始

../ /你的代码

ob_clean();//在你文件的末尾