当"在浏览器中显示PDF"选项未选中时,是否有方法强制PDF文件在浏览器中打开?
我尝试使用embed标记和iframe,但只有在选中该选项时才有效。
我能做什么?
要向浏览器指示应在浏览器中查看文件,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响应:您的服务器端编程语言)。
PDF的正确类型是application/pdf
,而不是application/force-download
。这看起来像是对一些传统浏览器的黑客攻击。如果可以的话,一定要使用正确的mimetype。
如果您可以控制服务器代码:
- 强制下载/提示:使用
header("Content-Disposition", "attachment; filename=myfilename.myextension");
- 浏览器尝试打开它:使用
header("Content-Disposition", "inline; filename=myfilename.myextension");
无法控制服务器代码:
- 使用HTML5下载属性。它使用在视图侧指定的自定义文件名
注意:我更喜欢在服务器端设置文件名,因为您可能有更多信息,并且可以使用通用代码。
(我误解了这个问题,下面的答案是关于强制下载文件而不是在浏览器中打开它)
如果你正在使用HTML5(我想现在每个人都在使用它),那么有一个名为download
的属性。
例如,
<a href="somepathto.pdf" download="filename">
这里filename
是可选的,但如果提供了,它将为下载的文件取这个名称。
编辑
我知道这与问题恰恰相反。对于那些(像我一样)来寻找相反问题的人,我保留相反的答案(证据:这个答案的赞成票比反对票多)
我有相同的问题,上面的大多数答案都应该能解决你的问题。不幸的是,即使我收到了内容类型&响应中的内容处置标头,但我的pdf仍在下载而不是查看。经过数小时的头脑风暴和尝试。
库普里特是萤火虫,在某种程度上它是me。紧张的笑声
默认情况下,当你在firefox中打开pdf文件时,它会为你提供一个弹出窗口,让你保存pdf文件或直接打开它。还有一个复选框,上面写着从现在起自动执行此操作并猜测是谁选择了它。
由于这个错误,我的pdf被下载而不是查看,即使有所有需要的头作为响应。这是一个简单的错误,但花费了我大量的时间。
要解决此问题,只需转到设置并搜索应用程序,然后将pdf设置更改为所需内容
这是针对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"
要修复chrome&移动浏览器错误,请执行以下操作:
- 将文件存储在项目中的目录中
- 使用谷歌PDF查看器
谷歌PDF查看器可以这样使用:
<iframe src="http://docs.google.com/gview?url=http://example.com/path/to/my/directory/pdffile.pdf&embedded=true" frameborder="0"></iframe>
如果您有Apache,请将其添加到.htaccess
文件中:
<FilesMatch ".(?i:pdf)$">
ForceType application/octet-stream
Header set Content-Disposition attachment
</FilesMatch>
哦,在我之前的文章中有打字错误。
header("Content-Type: application/force-download");
header("Content-type: application/pdf");
header("Content-Disposition: inline; filename="".$name."";");
如果您不希望浏览器提示用户,那么使用"inline"代替"attachment"作为第三个字符串。内联工作得很好。PDF会立即显示,而无需用户单击"打开"。我使用了"附件",这将提示用户打开、保存。我试着更改浏览器的设置,但它不会阻止提示。
对于需要启动输出缓冲区的大文件,请添加:-
启动时的ob_start();
//
//您的代码
ob_clean();
//在文件的末尾
您可以通过以下方式实现:
<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>
但现在只允许某些必需的文件。
我使用过这个代码,它运行得很好。
从根文件打开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."";");
}
以下是另一种在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>';
使用
<embed src="file.pdf" />
如果嵌入是一个选项或我的新插件,PIFF:https://github.com/terrasoftlabs/piff
如果您链接到。它将在浏览器中打开PDF
如果未选中该框,则应链接到.zip以强制下载。
如果.zip不是一个选项,那么使用PHP中的头强制下载
header('Content-Type: application/force-download');
header('Content-Description: File Transfer');