如何知道文件何时下载/"另存为"出现提示?

时间:2014-05-20 16:44:06

标签: javascript html

我在页面上有一个链接

<a class="btn btn-success" href="DownloadCsv">Download CSV</a>

当用户点击所述链接时,服务器会使用标题Content-Disposition: attachment进行响应,以使用“保存文件”对话框提示用户。

我想要完成的是:在服务器生成响应时禁用链接,并在服务器响应后启用它。

服务器是否有针对该响应的事件被触发?或者还有其他方法可以实现这一目标吗?

2 个答案:

答案 0 :(得分:1)

我想到的唯一方法就是使用AJAX。 您首先使用AJAX下载它,您可以在其中获得指导您的事件(例如就绪状态等)。 然后进行实际下载,但此时它将从浏览器缓存中提供。 所以它实际上并没有下载,而是立即从磁盘加载。 用户不会区分,但您将能够检测到实际下载的结束。

答案 1 :(得分:0)

我经历了旧的问题。我甚至不记得我需要它,但我现在决定回答这个问题,因为它在3。5年后还没有解决......它可以通过这种方式实现

链接可以是

<a class="btn btn-success" onclick="clickHandler(this); return false;">Download CSV</a>

处理程序

    function clickHandler(element) {
        //disable link
        var href = element.href;
        element.href = 'javascript:void(0)';

        //download file
        var xhr = new XMLHttpRequest();
        xhr.open('GET', 'DownloadCsv', true);
        xhr.responseType = 'arraybuffer';
        xhr.onload = function(e) {
          if (this.status == 200) {
            var uInt8Array = new Uint8Array(this.response);
            var i = uInt8Array.length;
            var binaryString = new Array(i);
            while (i--) { binaryString[i] = String.fromCharCode(uInt8Array[i]); }
            var data = binaryString.join('');

            //initiate save as dialog
            var base64 = window.btoa(data);
            var a = document.createElement('a'); 
            a.href = 'data:application/csv;base64,'+ base64; 
            a.setAttribute('download', 'data.csv');
            a.click();

            //enable link
            element.href = href;
          }
        };

        xhr.send(); 
    }