让我们来看看FireFox。
他们有一个很棒的大型号召性用语按钮:“Firefox 3.6 - 免费下载”
点击它,它会链接到一个新页面:“感谢您下载Firefox!您的下载应该在几秒钟后开始。”
然后几秒钟后弹出:“FIREFOX.exe - 你想保存或丢弃这个文件吗?”
这是针对整个网络的应用程序的标准下载行为。它是如何以最简单的方式完成的?
答案 0 :(得分:3)
这有两个部分:
让我们假装我们只是希望浏览器下载文件,而不想更改页面。我们可以创建这样的链接,它将按预期工作:
<a href="/download.zip">Download File</a>
您的浏览器可能不知道如何处理zip文件,因此它会将“download.zip”直接下载到以URL中的文件名命名的文件中。但是,如果你想下载一个JPG,那就不行了:
<a href="/images/sunset.jpg">Save this Sunset!</a>
您的浏览器知道如何显示JPEG,因此它会重定向页面并显示JPEG。现在我们需要告诉浏览器不要显示它,而是要下载它。为此,我们必须在服务器的响应中向它发送一些特定的HTTP头。
Apache可以通过在.htaccess中指定标题来处理这个问题,但是我会远离特定的技术,只选择谈论这个机制。
因此,我们将以下标题与图像一起发送到浏览器:
Content-disposition: attachment; filename=the_sunset_of_a_lifetime.jpg;
第一个标题content-disposition
告诉您的浏览器我们希望该文件是附件,换句话说,它应该保存,而不是显示。 filename
属性告诉它用于保存文件的名称(而不是“sunset.jpg”,文件将命名为“the_sunset_of_a_lifetime.jpg”)。
现在下载“sunset.jpg”文件的链接就像我们想要的那样。但是如何在没有用户点击链接的情况下让浏览器下载它,这样我们就可以显示“谢谢”页面并提示下载开始?一个简单的<meta>
标记可以解决这个问题,告诉浏览器在一段时间后重定向页面:
<meta http-equiv="refresh" content="2;url=/images/sunset.jpg">
当您的“谢谢”页面加载head
中的元标记时,它会等待2秒钟,然后尝试加载图片。它将获得我们在最后一步中设置的标题,并下载它而不是显示它,用户将保持在我们想要的页面上。
答案 1 :(得分:2)
thanks_for_downloading.html
的示例内容:
<strong>Thanks for downloading XY</strong>
<script type="text/javascript">
window.onload = function(){
window.location.href = "path/to/XY.exe";
};
</script>
下载链接只是thanks_for_downloading.html页面的链接
答案 2 :(得分:1)
号召性用语按钮是“谢谢”页面的常规链接。然后在“谢谢”页面上,使用javascript将用户重定向到您正在下载的文件,方法是将“window.location”属性设置为文件的URL。