2011-06-14 86 views
6

在我的项目,我使用类似下面的函数将用户重定向以下载文件如何知道何时从URL下载完成?

function promptDownload(file){ 
     location.href = "http://example.com/downloads/"+file; 
} 

大家都知道,当我调用这个函数,浏览器只提示一个下载对话框,并没有打断我的应用程序流。我想要做的是确定何时下载完成或取消。

应该有类似onLoad,onFinishedLoading,onConnectionEnd或等,但我找不到任何东西。

+2

我可能是错的,但我不相信你可以。如果你想控制很多,你可能需要将它交给Silverlight/Flash应用程序并嵌入回调函数。 (这就像将用户重定向到google.com并知道google何时完成加载)。 - 编辑:你也许可以使用服务器端文件处理程序和ajax客户端来保持同步,但这似乎非常繁琐。 – 2011-06-14 15:28:08

+0

@Brad:这就是[WeTransfer](https://www.wetransfer.com/)所做的。 – Midas 2011-06-14 15:31:57

回答

2

如果以这种方式下载文件,则无法确定下载进度。

如果你下载使用XMLHttpRequest文件,那么你可以听这样的负载,错误和进度事件:

function log(message) { 
    return function() { 
    alert(message); 
    }; 
} 

function download(file, callback) { 
    var request = new XMLHttpRequest(); 
    request.responseType = 'blob'; 
    request.open('GET', file); 
    request.addEventListener('load', log('load ' + file)); 
    request.addEventListener('error', log('error ' + file)); 
    request.addEventListener('progress', log('progress ' + file)); 
    request.addEventListener('load', function() { 
    callback(request.response); 
    }); 
    request.send(); 
} 

function save(object, mime, name) { 
    var a = document.createElement('a'); 
    var url = URL.createObjectURL(object); 
    a.href = url; 
    a.download = name; 
    a.click(); 
} 

document.querySelector('#download').addEventListener('click', function() { 
    download('test.pdf', function (file) { 
    save(file, 'application/pdf', 'test.pdf'); 
    }); 
}); 
<!DOCTYPE html> 
<html> 
    <head> 
    <meta charset="UTF-8"> 
    </head> 
    <body> 
    <button id="download">Download</button> 
    <script src="script.js"></script> 
    </body> 
</html>