1

간단한 배경 : Azure Blob 저장소에 파일을 저장하는 웹 서비스가 있습니다. 서비스 사용자는 여러 파일을 한 번에 다운로드 할 수 있습니다. 다운로드되는 모든 파일의 총 파일 크기가 비교적 작 으면 내 서버의 파일을 ZIP하여 해당 ZIP 파일을 반환합니다. 여기서 아무런 문제가 없습니다.브라우저에서 Azure Blob 저장소의 파일을 순차적으로 다운로드하십시오.

시나리오 : 예를 들어 사용자가 각각 1GB 인 3 개의 파일을 다운로드하려는 경우 이러한 파일을 서버로 다운로드하는 것이 현실적이지 않은 경우 ZIP 파일을 압축 한 다음 브라우저로 ZIP 파일을 반환합니다. 따라서 이러한 시나리오의 경우 Azure Blob 저장소 URL을 브라우저에 반환하고 사용자가 Azure Blob 저장소에서 직접 파일을 다운로드하도록하여 서버에 부담을주지 않도록합니다.

문제점 : 현재 브라우저는 이러한 URL을 모두 수신하고 즉시 다운로드합니다. 이 파일들을 순차적으로 다운로드 할 방법이 필요합니다. 따라서 브라우저는 BLOB 저장소 URL 목록을 받아 한 번에 하나씩 다운로드합니다. 그러나 하나의 다운로드가 완료되어 다른 하나가 시작할 수있을 때 브라우저에서 어떻게 감지 할 수 있는지 잘 모릅니다.

내가이 문제에 어떻게 접근해야하는지에 대한 조언이나 제안은 언제나 환영합니다.

편집 : 내 프런트 엔드 다운로드 ID 년대의 목록을 받아 당신은 jquery.fileDownload 라이브러리 Promise으로 시도 할 수

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

이 파일을 한 번에 다운로드하는 방법을 보여주는 코드가 있으므로이 시점부터 시작할 수 있습니다. –

+0

이러한 파일을 다운로드하는 방법에 대한 코드는 없습니다. 이것은 Azure BLOB 저장소 URL에 대한 문자 그대로 GET 요청입니다. –

+0

어떻게 GET 요청을했는지, show code : jQuery를 통해 본 것이거나 다른 것인가? –

답변

1

을 다운로드하기 시작합니다 : 그것은 필요하기 때문에,이 라이브러리를 수정해야합니다 또한

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)) 
} 

응답의 특정 쿠키 (blob에 대한 직접 링크로 인해 제공 할 수 없음) (if의 진술 조건이 바뀜) :

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; 
} 
+0

이것은 멋지다, 나는 그것을 가야겠다. 나는 C# 남자이고 내 JS/JQuery는 평균적으로 최고입니다. 이것에 대해 감사드립니다! –

관련 문제