2015-12-31 2 views
9

Я занимаюсь этим довольно долгое время и не могу найти ясный ответ/способ решить мою проблему.Загрузите файл из http response body

Ситуация такова: я отправляю запрос на отправку на сервер. Ответ содержит двоичный файл pcap в его теле. Как загрузить его в виде файла.

Мой упрощенный код:

... 
this.downloadPcap = function(timestamp){ 
    var start = timestamp-10; 
    var end = timestamp+10; 
    var requestData = {"start": start, "end": end}; 
    $http.post(serverUrl, requestData); 
} 

Это вызвано щелчком, где я получаю метку времени какого-либо события, а сервер создает файл PCAP от 10 секунд до и после точного события.

Получаю ответ с длинным двоичным кодом. также:

Content-Length: 134772

Content-Type: применение/PCAP

Теперь мне сказали, что если заголовок будет таким образом, браузер будет автоматически начать загрузку ответ в виде файла. Это не так.

Так что я немного читал о Blob и FileSaver, но я чувствую, что должен быть более простой способ загрузки файлов, которые создаются динамически.

Может кто-нибудь указать мне в каком-то направлении? Нет ли более простого способа, чем включение большего количества библиотек?

Заранее спасибо

+0

Попробуйте этот ответ http://stackoverflow.com/questions/3665115/create-a-file-in-memory-for-user-to-download-not-through-server#answer-18197341 – jcubic

+0

Вы пробовали добавить заголовок Content-Disposition? 'Content-Disposition: attachment; filename = "testfile.someext" ' – marekful

+0

Я бы предложил форму с iframe, но после углового сообщения json вместо данных формы вам нужно будет использовать не очень простой метод ajax -> blob url. – Musa

ответ

2

бобра указал мне ответ здесь: https://stackoverflow.com/a/20904398/5459561

работает отлично! Я лично загружаю PCAP, и кодировка отличается, но все остальное работает!

$ http service возвращает обещание, которое имеет два метода обратного вызова, как показано ниже.

$http({method: 'GET', url: '/someUrl'}). 
    success(function(data, status, headers, config) { 
    var anchor = angular.element('<a/>'); 
    anchor.attr({ 
     href: 'data:attachment/csv;charset=utf-8,' + encodeURI(data), 
     target: '_blank', 
     download: 'filename.csv' 
    })[0].click(); 

    }). 
    error(function(data, status, headers, config) { 
    // if there's an error you should see it here 
    });