如何在HTML链接中下载PDF文件?

Pra*_*ant 119 php pdf xhtml markup download

我在我的网页上提供pdf文件的链接供下载,如下所示

<a href="myfile.pdf">Download Brochure</a>
Run Code Online (Sandbox Code Playgroud)

问题是当用户点击此链接时

  • 如果用户已安装Adobe Acrobat,则会在Adobe Reader的同一浏览器窗口中打开该文件.
  • 如果未安装Adobe Acrobat,则会弹出一个用于下载文件的用户.

但我希望它总是弹出给用户下载,无论是否安装了"Adobe acrobat".

请告诉我怎么做到这一点?

T_D*_*T_D 192

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

<a href="./directory/yourfile.pdf" download="newfilename">Download the pdf</a>
Run Code Online (Sandbox Code Playgroud)

newfilename用户保存文件的建议文件名在哪里.如果你把它留空,它将默认为服务器端的文件名,如下所示:

<a href="./directory/yourfile.pdf" download>Download the pdf</a>
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这是一个简单的解决方案,但遗憾的是并没有得到广泛的支持,尤其是 IE http://caniuse.com/#feat=download不支持 (9认同)
  • 就像镀铬版39.0.2171.65(64位)的魅力! (3认同)
  • 是的,我知道的.这就是为什么我有关于兼容性的附注.根据你的来源,IE和Safari都不支持这种方法,或者至少还没有支持:)无论如何,如果你想让所有浏览器强制下载,我建议你检查一些其他答案...... (2认同)

Tra*_*isO 116

而不是链接到.PDF文件,而是做类似的事情

<a href="pdf_server.php?file=pdffilename">Download my eBook</a>
Run Code Online (Sandbox Code Playgroud)

它输出一个自定义标题,打开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); 
Run Code Online (Sandbox Code Playgroud)

PS:显然对"文件"变量进行了一些健全性检查,以防止人们窃取您的文件,例如不接受文件扩展名,拒绝斜杠,将.pdf添加到值

  • 但是,在逐字使用此代码时要小心.这会引入严重的LFI漏洞,因为您将GET变量直接传递给`fopen`. (4认同)
  • 此代码可能以另一种方式存在危险.如果您将HTTP链接传递给fopen,我认为它将从另一台服务器检索文件.攻击者可以使用它来尝试扫描内部网络以查找公开的PDF文件. (4认同)
  • @TravisO`"内容类型:应用程序/强制下载"`未在此处列出:http://www.iana.org/assignments/media-types/application这是一个完全虚假的标题.请不要编写标题并发送它们.你能更新你的答案吗?谢谢. (3认同)
  • 我面临另一个问题,我的文件位于/products/brochure/myfile.pdf我将$ file变量作为$ file_path = $ _SERVER ['DOCUMENT_ROOT'].'/ products/brochure /.$文件; 但它将文件下载为"%2Fvar%2Fwww%2Fweb15%2Fweb%2Fproducts%2Fbrochure%2myfile.pdf" (2认同)
  • 更不用说绕过你认为你将对"文件"参数做的任何"健全性检查"是多么容易.路径注入/目录遍历攻击非常可能. (2认同)

Ale*_*x V 49

不要遍历每个文件行.使用readfile代替,它更快.这是关于PHP网站: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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • *readfile*函数确实更快.我个人建议使用这个答案而不是接受的答案 (3认同)

Rob*_*b W 24

而不是使用PHP脚本来读取和刷新文件,使用重写头文件更为简洁.htaccess.这将保留一个"漂亮"的URL(myfile.pdf而不是download.php?myfile).

<FilesMatch "\.pdf$">
ForceType applicaton/octet-stream
Header set Content-Disposition attachment
</FilesMatch>
Run Code Online (Sandbox Code Playgroud)

  • @TecBrat 或仅将 .htaccess 文件放在需要此行为的子文件夹中。 (2认同)

Ale*_*x W 14

我发现了一种方法,可以使用简单的旧HTML和JavaScript/jQuery来优雅地降级.在IE7-10,Safari,Chrome和FF中测试过:

HTML下载链接:

<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>
Run Code Online (Sandbox Code Playgroud)

jQuery(纯JavaScript代码会更详细)模拟在一小段延迟后点击链接:

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

为了使这更加健壮,您可以添加HTML5功能检测,如果不存在,则使用window.open()该文件打开一个新窗口.


Sud*_*Def 5

这是关键:

header("Content-Type: application/octet-stream");
Run Code Online (Sandbox Code Playgroud)

发送PDF文件时发送内容类型application/x-pdf-document或application/pdf.Adobe Reader通常为此MIME类型设置处理程序,以便在收到任何PDF MIME类型时,浏览器会将文档传递给Adobe Reader.


小智 5

这可以使用 HTML 来实现。

<a href="myfile.pdf">Download Brochure</a>
Run Code Online (Sandbox Code Playgroud)

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

<a href="myfile.pdf" download>Download Brochure</a>
Run Code Online (Sandbox Code Playgroud)

指定下载属性的值:

<a href="myfile.pdf" download="Brochure">Download Brochure</a>
Run Code Online (Sandbox Code Playgroud)

这里的文件名是 Brochure.pdf