简要背景:我有一个Web服务,可以在Azure Blob存储中存储文件。该服务的用户可以一次下载多个文件。如果正在下载的所有文件的总文件大小相对较小,那么我将服务器上的文件压缩并返回该ZIP文件 - 这里没问题。
场景:例如,如果用户想要下载3个1GB的文件,那么将这些文件下载到服务器并将其压缩,然后将ZIP文件返回给浏览器并不现实。 。因此,对于这些场景,我将Azure Blob存储URL返回到浏览器,并让用户直接从Azure Blob存储下载文件,以免给我的服务器带来压力。
问题:目前,浏览器只接收所有这些URL并一次性下载所有这些URL。我需要一种顺序下载这些文件的方法。因此,浏览器会收到一个Blob存储URL列表,并一次下载一个。但是,我不知道如何在一次下载完成后在浏览器上进行检测,因此可以开始另一次下载。
欢迎任何有关如何处理这方面的意见/建议。
编辑:我的前端收到下载ID列表并开始下载
for(var i = 0; i < listOfDownloads.length; i++) {
//Go direct to Azure blob storage for each ID in list of IDs
//This immediately begins a download direct from blob storage
window.location.href = {azure blob storage URL};
//Find way of detecting when download complete so can move on to next
}
答案 0 :(得分:1)
您可以使用Promise
function downloadFilesSequantially(listOfDownloads) {
function downloadComplete(link) {
return new Promise(function(res, rej) {
$.fileDownload(link)
.done(function() {
res(0);
})
.fail(function() {
rej(0);
});
})
}
listOfDownloads.reduce(function(prev, next) {
return prev.then(downloadComplete(next));
}, Promise.resolve(0))
}
此外,您应该修改此库,因为它需要特定的cookie作为响应,由于直接链接到blob而无法提供(if
的语句条件已被替换):< / p>
if (true/*document.cookie.indexOf(settings.cookieName + "=" + settings.cookieValue) != -1*/) {
//execute specified callback
internalCallbacks.onSuccess(fileUrl);
//remove the cookie and iframe
document.cookie = settings.cookieName + "=; expires=" + new Date(1000).toUTCString() + "; path=" + settings.cookiePath;
cleanUp(false);
return;
}