2014-09-12 1 views
0

У меня есть сервер backend в игровой инфраструктуре, который возвращает огромный файл text/csv в кусках. Как я могу получить файл в угловом формате, чтобы сохранить файл в клиенте.Загрузить текст/содержимое csv как огромный файл с сервера в Angular

В обычной загрузке файла можно использовать следующий раствор:

$http.post('/exportFile', reqData). 
      success(function(data, status, headers, config){ 
       var pom = document.createElement('a'); 
       pom.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(data)); 
       pom.setAttribute('download', "file.csv"); 
       pom.click(); 
      }). 
      error(function(data, status, headers, config){ 
       alert(data); 
      }); 

Но как обрабатывать порции? Спасибо!

ответ

2

Несколько мыслей -

По умолчанию углового и основных стек HTTP будет абстрактные «куски» от вас в один обратный вызов/отказа. Если вы действительно хотите обрезать данные, вам может понадобиться другая схема URL-адресов для публикации результатов (а затем выдача серии запросов) или метода веб-push, например websockets (где сервер нажимает каждый бит). Может быть, я что-то упустил, но вы пробовали выдавать другой запрос в пределах углового после того, как запрос/exportFile сделан?

$http.post('/exportFile', reqData).success(function(...){ 
    // create url to where file.csv is, say fileURL 
    var fileUrl = encodeURIComponent(data); 
    $http.get(fileUrl).success(function(data...) { 
    // data is now the contents of file.csv. 
    fileContents = data; 
    }); 
} 

Файлы CSV, вероятно, легко сжимаются, возможно, вы уже это делаете.

Наконец, рекомендуемый шаблон MVC с угловым элементом состоит в том, чтобы создавать элементы в рамках директивы и использовать двустороннюю привязку. Вы также можете нажать на ссылку на элемент, если вы хотите, чтобы немедленно вызвать загрузку в директивы после того, как появится через:

$timeout(function() { 
    angular.element(directiveElement).triggerHandler('click'); 
}, 0); 

Ладно, надеюсь, что помогает

+0

так что в основном вы говорите, если сервер возвращает файл в кусках, его можно получить в интерфейсе с помощью обычного обработчика $ http.success? Нет необходимости обрабатывать куски? –

+0

другой, хотя при написании фрагментов, почему я не вижу нескольких ответов на метод записи? общественный статический индекс Результат() {// подготовить Chunked поток текста Куски чанки = новые StringChunks() { // Вызывается, когда поток готов общественности недействительным onReady (Chunks.Out из) { out.write ("Kiki"); out.write ("foo"); out.write ("bar"); out.close(); } }; // Обслуживает этот поток с помощью 200 OK return ok (chunks); } –

+0

Я не думаю, что вы получите инкрементный доступ к файлу на клиенте как 1 к 1 с каждым вызовом .write(). Чанкрованные ответы просто плохо поддерживаются, поскольку кометы/websockets/sse больше заняли место для потоковой передачи. В любом случае, вы также можете играть с XHR напрямую, чтобы попытаться получить каждый кусок в отдельности, например. var xhr = new XMLHttpRequest() xhr.open ("POST", "/ exportFile", true) xhr.onprogress = function() { console.log ("onProgress" + xhr.responseText) } –

 Смежные вопросы

  • Нет связанных вопросов^_^