2014-03-14 3 views
1

Я пытаюсь выполнить загрузку файла через angular.js Файл приходит с сервера в двоичном формате, тип контента application/octet-streamЗагрузка архива с помощью углового

Загрузка является GET с использованием $resource. Рассматривая параметр, переданный обратному вызову (он называется content), это объект, содержащий массив байтов, а также список свойств для $resource.

Пробовал несколько способов обслуживания файла, но безуспешно.

Первый из них:

... 
var a = document.createElement('a'); 
a.href = "data:attachment/zip," + content; 
a.download = zipName; 
a.click(); 

В этом случае содержимое файла почтового индекса является [object Object]

Я попытался извлекая массив из объекта и соединения все в строковую переменную. Почтовый файл в этом случае намного больше обычного размера. Мне пришлось установить isArray: true в службу, которая вызывает $resource, иначе не было способа извлечь содержимое байта из объекта ответа.

Вот как я это сделал:

var str = ''; 
for (var i = 0; i < content.length; i++) { 
    str += content[i][0]; 
} 

... 
var a = document.createElement('a'); 
a.href = "data:attachment/zip," + str; 
a.download = zipName; 
a.click(); 

Стоит отметить, что вызов encodeURI на str приращений резко размером загруженного почтового индекса, но архив остается недействительным.

Я также попытался создать Blob из str и установить тип контента application/octet-stream, без везения.

var blob = new Blob([str], {'type':"application/octet-stream"}); 
a.href = window.URL.createObjectURL(blob); 
... 

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

Справка приветствуется.

Благодаря

+0

помните, что вы можете столкнуться с проблемами загрузки с IE11 http://stackoverflow.com/questions/18755750/saving-text-in-a-local-file-in-internet-explorer-10/20927897# 20927897 – spankmaster79

ответ

1

Я только что нашел ваш пост и фиксированный ответ, используя то, что вы завербовать.

  • Во-первых, вы должны убедиться, что угловой запрос $ HTTP включает в себя, как показано на следующем получить примере (include responseType: 'arraybuffer')

    $http.get('/downloadZip', { 
          params: { 
           file: encodeURIComponent(filepath) 
          }, 
          responseType: 'arraybuffer' 
    //your code 
    
  • Во-вторых на ваш успех или обработчиком обещание, вы должны изменить ваш window.URL.createObjectURL(blob) к URL.createObjectURL(blob) , Реализация что-то подобное следующему:

    var a = document.createElement('a'); 
    var blob = new Blob([data], {'type':"application/octet-stream"}); 
    a.href = URL.createObjectURL(blob); 
    a.download = "filename.zip"; 
    a.click(); 
    

С этим вы создаете новый анкерный элемент и моделирования, чтобы открыть его. При правильном создании Blob, так как запрос был изменен правильно.

+1

не работает в Firefox – spankmaster79

1

Угловой не требуется.

var zip_file_path = "" //put inside "" your server path with file.zip 
var zip_file_name = "" //put inside "" file name or something 
var a = document.createElement("a"); 
document.body.appendChild(a); 
a.style = "display: none"; 
a.href = zip_file_path; 
a.download = zip_file_name; 
a.click(); 
document.body.removeChild(a); 
Смежные вопросы