Pra*_*ant 119 php pdf xhtml markup download
我在我的网页上提供pdf文件的链接供下载,如下所示
<a href="myfile.pdf">Download Brochure</a>
Run Code Online (Sandbox Code Playgroud)
问题是当用户点击此链接时
但我希望它总是弹出给用户下载,无论是否安装了"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
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添加到值
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文件......
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)
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()该文件打开一个新窗口.
这是关键:
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