如何使 PDF 文件可以在 HTML 链接下载?

我给我的网页下载 PDF 文件的链接,如下

<a href="myfile.pdf">Download Brochure</a>

问题是当用户点击这个链接时

  • 如果用户已经安装了 AdobeAcrobat,那么它会在 AdobeReader 的同一个浏览器窗口中打开该文件。
  • 如果没有安装 AdobeAcrobat,用户就会弹出它来下载文件。

但我希望它总是弹出到用户下载,无论“ Adobeacrobat”是否安装。

请告诉我该怎么做?

745077 次浏览

不要链接到.PDF 文件,而是执行以下操作

<a href="pdf_server.php?file=pdffilename">Download my eBook</a>

输出一个自定义头,打开 PDF (二进制安全)和打印数据到用户的浏览器,然后他们可以选择保存的 PDF,尽管他们的浏览器设置。Pdf _ server.php 应该是这样的:

header("Content-Type: application/octet-stream");


$file = $_GET["file"] .".pdf";
header("Content-Disposition: attachment; filename=" . urlencode($file));
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");
header("Content-Length: " . filesize($file));
flush(); // this doesn't really matter.
$fp = fopen($file, "r");
while (!feof($fp))
{
echo fread($fp, 65536);
flush(); // this is essential for large downloads
}
fclose($fp);

并且显然对“ file”变量运行一些健全检查,以防止人们窃取您的文件,如不接受文件扩展名,拒绝斜杠,添加。Pdf 的价值

这是关键:

header("Content-Type: application/octet-stream");

内容类型的应用程序/x-PDF-文件或应用程序/PDF 是在发送 PDF 文件时发送的。Adobe Reader 通常为这种 MIME 类型设置处理程序,因此当收到任何 PDF MIME 类型时,浏览器都会将文档传递给 Adobe Reader。

在 Ruby on Rails 应用程序中(特别是使用 Prawn gem 和 Prawnto Rails 插件) ,您可以比使用完整的脚本(如前面的 PHP 示例)更简单地完成这一任务。

在你的控制器中:

def index


respond_to do |format|
format.html # Your HTML view
format.pdf { render :layout => false }
end
end

呈现: lay= > false 部分告诉浏览器打开“愿意下载此文件吗?”提示,而不是尝试呈现 PDF。然后您就能够正常地链接到文件: http://mysite.com/myawesomepdf.pdf

不要在每个文件行中循环 。 使用 读文件代替,它的速度更快: Http://php.net/manual/en/function.readfile.php

$file = $_GET["file"];
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header("Content-Type: application/force-download");
header('Content-Disposition: attachment; filename=' . urlencode(basename($file)));
// header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}

确保消毒你的 get 变量,因为有人可以下载一些 php 文件..。

与使用 PHP 脚本读取和刷新文件不同,使用 .htaccess重写头部更方便。这将保持一个“不错”的 URL (myfile.pdf而不是 download.php?myfile)。

<FilesMatch "\.pdf$">
ForceType applicaton/octet-stream
Header set Content-Disposition attachment
</FilesMatch>

试试这个:

<a href="pdf_server_with_path.php?file=pdffilename&path=http://myurl.com/mypath/">Download my eBook</a>

Pdf _ server _ with _ path.php 中的代码是:

header("Content-Type: application/octet-stream");


$file = $_GET["file"] .".pdf";
$path = $_GET["path"];
$fullfile = $path.$file;


header("Content-Disposition: attachment; filename=" . Urlencode($file));
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");
header("Content-Length: " . Filesize($fullfile));
flush(); // this doesn't really matter.
$fp = fopen($fullfile, "r");
while (!feof($fp))
{
echo fread($fp, 65536);
flush(); // this is essential for large downloads
}
fclose($fp);

这是一个常见的问题,但很少有人知道有一个简单的 HTML 5解决方案:

<a href="./directory/yourfile.pdf" download="newfilename">Download the pdf</a>

其中 newfilename是建议用户保存文件的文件名。或者,如果您将其保留为空,它将默认为服务器端的文件名,如下所示:

<a href="./directory/yourfile.pdf" download>Download the pdf</a>

兼容性: 我在 Firefox 21和 Iron 上进行了测试,两者都运行良好。它可能无法在 HTML5不兼容或过时的浏览器上工作。我测试过的唯一没有强制下载的浏览器是 IE..。

检查兼容性: http://caniuse.com/#feat=download

我找到了一种使用普通的 HTML 和可以优雅降级的 JavaScript/jQuery 来实现这一点的方法。在 IE7-10,Safari,Chrome 和 FF 中测试:

下载链接:

<p>Thanks for downloading! If your download doesn't start shortly,
<a id="downloadLink" href="...yourpdf.pdf" target="_blank"
type="application/octet-stream" download="yourpdf.pdf">click here</a>.</p>

JQuery (纯 JavaScript 代码会更加冗长)模拟在一个小延迟后点击链接:

var delay = 3000;
window.setTimeout(function(){$('#downloadLink')[0].click();},delay);

为了使其更加健壮,你可以添加 HTML5特征提取,如果没有,那么使用 window.open()打开一个新的窗口。

这里有一个不同的方法。我更喜欢使用 Web 服务器逻辑,而不是依赖于浏览器支持,或者在应用程序层解决这个问题。

如果您正在使用 Apache,并且可以将。在相关目录下的 htaccess 文件,你可以使用下面的代码。当然,如果您能够访问 httpd.conf,也可以将其放在 httpd.conf 中。

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

FilesMatch 指令只是一个正则表达式,因此可以根据需要按粒度设置它,也可以添加其他扩展。

Header 行的作用与上面 PHP 脚本中的第一行相同。如果您还需要设置 Content-Type 行,那么您可以以同样的方式来设置,但是我认为没有必要。

我知道现在回答这个问题已经很晚了,但是我找到了一个用 javascript 实现的方法。

function downloadFile(src){
var link=document.createElement('a');
document.body.appendChild(link);
link.href= src;
link.download = '';
link.click();
}

我使用 PDF 文件的整个 URL 解决了我的问题(而不是仅仅把文件名或位置放到 href 中) : A href = “ domain. com/pdf/filename.pdf”

如果你需要限制下载速度,使用这个代码! !

<?php
$local_file = 'file.zip';
$download_file = 'name.zip';


// set the download rate limit (=> 20,5 kb/s)
$download_rate = 20.5;
if(file_exists($local_file) && is_file($local_file))
{
header('Cache-control: private');
header('Content-Type: application/octet-stream');
header('Content-Length: '.filesize($local_file));
header('Content-Disposition: filename='.$download_file);


flush();
$file = fopen($local_file, "r");
while(!feof($file))
{
// send the current file part to the browser
print fread($file, round($download_rate * 1024));
// flush the content to the browser
flush();
// sleep one second
sleep(1);
}
fclose($file);}
else {
die('Error: The file '.$local_file.' does not exist!');
}


?>

了解更多信息

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>File Uploader</title>
<script src="../Script/angular1.3.8.js"></script>
<script src="../Script/angular-route.js"></script>
<script src="../UserScript/MyApp.js"></script>
<script src="../UserScript/FileUploder.js"></script>
<>
.percent {
position: absolute;
width: 300px;
height: 14px;
z-index: 1;
text-align: center;
font-size: 0.8em;
color: white;
}


.progress-bar {
width: 300px;
height: 14px;
border-radius: 10px;
border: 1px solid #CCC;
background-image: -webkit-gradient(linear, left top, left bottom, from(#6666cc), to(#4b4b95));
border-image: initial;
}


.uploaded {
padding: 0;
height: 14px;
border-radius: 10px;
background-image: -webkit-gradient(linear, left top, left bottom, from(#66cc00), to(#4b9500));
border-image: initial;
}
</>
</head>
<body ng-app="MyApp" ng-controller="FileUploder">
<div>
<table ="width:100%;border:solid;">
<tr>
<td>Select File</td>
<td>
<input type="file" ng-model-instant id="fileToUpload" onchange="angular.element(this).scope().setFiles(this)" />
</td>
</tr>
<tr>
<td>File Size</td>
<td>
<div ng-repeat="file in files.slice(0)">
<span ng-switch="file.size > 1024*1024">
<span ng-switch-when="true">\{\{file.size / 1024 / 1024 | number:2}} MB</span>
<span ng-switch-default>\{\{file.size / 1024 | number:2}} kB</span>
</span>
</div>
</td>
</tr>
<tr>
<td>
File Attach Status
</td>
<td>\{\{AttachStatus}}</td>
</tr>
<tr>
<td>
<input type="button" value="Upload" ng-click="fnUpload();" />
</td>
<td>
<input type="button" value="DownLoad" ng-click="fnDownLoad();" />
</td>
</tr>
</table>
</div>
</body>
</html>

这可以通过使用 HTML 来实现。

<a href="myfile.pdf">Download Brochure</a>

添加下载属性: 这里的文件名是 myfile.pdf

<a href="myfile.pdf" download>Download Brochure</a>

为下载属性指定一个值:

<a href="myfile.pdf" download="Brochure">Download Brochure</a>

这里的文件名是 Brochure.pdf