我在我的网页上提供pdf文件的链接供下载,如下所示
<a href="myfile.pdf">Download Brochure</a>
问题是当用户点击此链接时
但我希望它总是弹出给用户下载,无论是否安装了“Adobe acrobat”。
请告诉我怎么做?
答案 0 :(得分:175)
这是一个常见问题,但很少有人知道有一个简单的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 ...
答案 1 :(得分:114)
而不是链接到.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);
PS:显然对“file”变量运行一些健全性检查,以防止人们窃取您的文件,例如不接受文件扩展名,拒绝斜杠,将.pdf添加到值
答案 2 :(得分: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;
}
确保清理你的get变量,因为有人可以下载一些php文件......
答案 3 :(得分:25)
使用.htaccess
重写标题更为简洁,而不是使用PHP脚本来读取和刷新文件。这将保留一个“漂亮”的网址(myfile.pdf
而不是download.php?myfile
)。
<FilesMatch "\.pdf$">
ForceType applicaton/octet-stream
Header set Content-Disposition attachment
</FilesMatch>
答案 4 :(得分:15)
我找到了一种方法,可以使用简单的旧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>
jQuery(纯JavaScript代码会更详细)模拟在一小段延迟后点击链接:
var delay = 3000;
window.setTimeout(function(){$('#downloadLink')[0].click();},delay);
为了使这个功能更强大,您可以添加HTML5功能检测,如果不存在,请使用window.open()
打开包含该文件的新窗口。
答案 5 :(得分:6)
这是关键:
header("Content-Type: application/octet-stream");
发送PDF文件时发送内容类型application / x-pdf-document或application / pdf。 Adobe Reader通常会为此MIME类型设置处理程序,以便在收到任何PDF MIME类型时,浏览器会将文档传递给Adobe Reader。
答案 6 :(得分:5)
HTML5中有一种更简单的方法:添加Download
属性。
大多数现代浏览器都支持它。
<a download href="file.pdf">Download PDF</a>
答案 7 :(得分:4)
我知道我回答这个问题的时间已经很晚了但是我在javascript中找到了一个黑客。
function downloadFile(src){
var link=document.createElement('a');
document.body.appendChild(link);
link.href= src;
link.download = '';
link.click();
}
答案 8 :(得分:1)
这可以使用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
答案 9 :(得分:0)
试试这个:
<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);
答案 10 :(得分:0)
这是一种不同的方法。我更喜欢而不是依赖浏览器支持,或者在应用层解决这个问题,以使用Web服务器逻辑。
如果您使用的是Apache,并且可以将.htaccess文件放在相关目录中,则可以使用以下代码。当然,如果你有权访问它,你也可以把它放在httpd.conf中。
<FilesMatch "\.(?i:pdf)$">
Header set Content-Disposition attachment
</FilesMatch>
FilesMatch指令只是一个正则表达式,因此可以根据需要进行精细设置,也可以添加其他扩展名。
Header行与上面PHP脚本中的第一行完全相同。如果你还需要设置Content-Type行,你可以用同样的方式设置,但我还没有找到必要的。
答案 11 :(得分:0)
我使用PDF文件的整个网址解决了我的问题(而不仅仅是将文件名或位置放到href中): a href =“domain.com / pdf / filename.pdf”
答案 12 :(得分:0)
如果您需要限制下载速度,请使用此代码!
<?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!');
}
?>
有关更多信息,click here
答案 13 :(得分:0)
<!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>
答案 14 :(得分:-1)
在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
渲染:layout =&gt; false部分告诉浏览器打开“你想下载这个文件吗?”提示而不是尝试呈现PDF。然后,您就可以正常链接到该文件:http://mysite.com/myawesomepdf.pdf