链接后执行“thanks_for_downloading.html”+“保存文件...”的标准方法?

时间:2011-02-08 21:45:12

标签: javascript html web-applications download

让我们来看看FireFox。

他们有一个很棒的大型号召性用语按钮:“Firefox 3.6 - 免费下载”

点击它,它会链接到一个新页面:“感谢您下载Firefox!您的下载应该在几秒钟后开始。”

然后几秒钟后弹出:“FIREFOX.exe - 你想保存或丢弃这个文件吗?”

这是针对整个网络的应用程序的标准下载行为。它是如何以最简单的方式完成的?

3 个答案:

答案 0 :(得分:3)

这有两个部分:

  1. 强制浏览器下载文件,而不是尝试显示它(使用.exe没有问题,但您可能也希望使用图像,电影或HTML文件)。
  2. 提示浏览器下载文件。
  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。