下载提示窗口显示时,启动多次下载并获得反馈

For*_*vin 19 html javascript iframe download

我正在编写一个生成html文件的小程序,并使用默认浏览器打开它以启动多个下载.
我不想为每次下载打开一个选项卡/窗口,因此为下载创建隐藏的iframe似乎是一个很好的解决方案.
我正在使用onloadiframe来查明每个下载的下载提示是否已经显示.但是,这种方法在Internet Explorer中似乎非常不可靠.

所以我想知道是否有办法解决这个问题或者更好的方法?
(请不要图书馆.)

这是我的html/js代码:

<!DOCTYPE html>
<!-- saved from url=(0016)http://localhost -->
<html><head>
  <meta content="text/html;charset=utf-8" http-equiv="Content-Type">
  <meta content="utf-8" http-equiv="encoding">
  <title>Downloads</title>
  <script>
    "use strict";
    var downloadsInfo = {
        "http://download-installer.cdn.mozilla.net/pub/firefox/releases/26.0/win32/en-US/Firefox%20Setup%2026.0.exe":"Status: Connecting",
        "http://download.piriform.com/ccsetup410.exe":"Status: Connecting"
    };
    var i = 0;
    var iv = setInterval(function() {
        i = ++i % 4;
        var j = 0;
        var finished = true;
        for (var key in downloadsInfo) {
            var value = downloadsInfo[key];
            if (value != "Status: Download Started!") {
                value = value+Array(i+1).join(".");
                finished = false;
            }
            document.getElementsByTagName("div")[j].innerHTML = key+"<br/>"+value;
            j = j+1;
        }
        if (finished) {
            alert('Done! You can close this window/tab now.');
            clearInterval(iv);
        }
    }, 800);
  </script>
</head><body>
  <h3>Please wait for your downloads to start and do not reload this site.</h3>
  <div></div> <br/><br/>
  <div></div> <br/><br/>
  <iframe src="http://download-installer.cdn.mozilla.net/pub/firefox/releases/26.0/win32/en-US/Firefox%20Setup%2026.0.exe" onload="downloadsInfo['http://download-installer.cdn.mozilla.net/pub/firefox/releases/26.0/win32/en-US/Firefox%20Setup%2026.0.exe'] = 'Status: Download Started!';" style="display:none"></iframe>
  <iframe src="http://download.piriform.com/ccsetup410.exe" onload="downloadsInfo['http://download.piriform.com/ccsetup410.exe'] = 'Status: Download Started!';" style="display:none"></iframe>
</body></html>
Run Code Online (Sandbox Code Playgroud)

Dav*_*der 4

很简单,您无法知道本机浏览器下载是否已开始。每个浏览器都有不同的处理方式,用户可以设置他的浏览器来提示位置,或者他可能只是让它自动下载到文件夹Downloads(当今大多数浏览器中的默认设置)。如果他提示输入位置,他可能会错误地取消,但您的设置仍会声称下载已开始。因此,不,没有任何方法可以可靠地通知用户,一旦所有下载开始/完成,他们可以关闭选项卡...前提是您使用本机浏览器下载机制。

实现这种效果的方法可能是首先使用 Javascript 下载文件(要求您有权访问这些文件,当然不能选择热链接到第三方文件)。要查看实际效果,请尝试从 mega.nz 下载文件。我本来打算写下如何手动执行此操作,但已经有一个很好的(相当过时的)答案概述了这一点

如果目的只是确保下载已开始,您可以在后端实现一个触发器来记录文件何时被访问。最简单的形式如下:

  1. 页面download.html请求file.php?location=[...]&randomHash=1234
  2. 一旦实际加载,它将在内存或id已启动file.php的数据库中设置一个标志。randomHash1234
  3. file.php将带有标题的页面重定向302到实际文件位置。
  4. download.html使用 Ajax 定期检查是否randomHash=1234已引发标志。如果是这样,它就知道下载已经开始。