2017-02-15 22 views
0

Мне нужно скачать большой файл из углового. У меня есть ссылка, и когда клиент кликает, файл должен быть загружен. код в контроллере:AngularJs, скачать большие файлы

$scope.download = function(id, type){ 
    LogService.getLogFile(id, type) //service call endpoint of backend 
        .then(function (data) { 

         var file = new Blob([data], {type: 'application/csv;charset=utf-8'}); 
         var fileURL = $window.URL.createObjectURL(file); 
         a.href = fileURL; 
         a.download = fileName; 
         a.click(); 
        }) 
        .catch(function (err) { 
         //error 
        }); 
} 

Он работает для небольших файлов (300MB), но с большими файлами (800MB) не работают. Мне нужно будет скачать файлы до 4Gb. И с основным браузером (Chrome, Mozilla и Safari). Потому что я видел в jimmywarting/StreamSaver.js решение (не тестировалось), но только для Chrome и Opera.

Я использую узел Js в интерфейсе, код:

function getFile(req, res){ 

    res.setHeader('Content-Type', 'application/octet-stream'); 
    res.setHeader('Content-disposition', 'attachment'); 

    var filePath = '....'; //PATH 
    var readStream = fs.createReadStream(filePath); 

    readStream.pipe(res); 

    }) 
    .catch(function() { 
     res.sendStatus(400); 
    }) 

Спасибо.

ответ

1

Наконец-то я решил добавить токен в url и запросить api.

HTML:

<a ng-click="downloadFile('attributes')" ng-if="log.path_attributes_file">download</a> 

Controller, добавить к URL PARAM 'маркер'.

//Download File 
     $scope.downloadFile = function downloadFile(type) { 
      window.location.href = '/api/logs/' + $scope.log._id +'/' + type + '?token=' + $http.defaults.headers.common['Authorization']; 
     } 

app.js в узле Js, для получения токена с URL-адреса. По умолчанию взять только заголовок. Я использую модуль «express-jwt». И маркер: 'Знаменосец 23f334f ... лексема ... dafafad'

app.use('/api', expressJwt({ secret: config.secret ,getToken: function fromHeaderOrQuerystring (req) { 
    if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') { 
     return req.headers.authorization.split(' ')[1]; 
    } else if (req.query && req.query.token.split(' ')[0] === 'Bearer') { 
     return req.query.token.split(' ')[1]; 
    } 
    return null; 
}}).unless({ path: ['/api/users/authenticate', '/api/users/register'] })); 

запрос Handler в узле JS. «nameFile» - это имя загруженного файла, а «pathFile» - это путь, в котором находится файл.

function getFile(req, res){ 
    res.setHeader('Content-Type', 'text/csv'); 
    res.setHeader('Content-disposition', 'attachment'); 
    res.attachment(nameFile); 
    res.sendFile(path.resolve(pathFile)); 
} 
0

Попробуйте это:

заменить

a.href = fileURL; 

в

window.location.href = fileURL; 
+0

Не работает, ошибка «Веб-страница не найдена для адреса blob». Спасибо –

+0

try 'window.location.href = data;' –

+0

window.location.href = data; заменяя весь код? –

0

Ниже ссылки это дает хорошее объяснение.

http://blog.neilni.com/2016/04/23/download-file-in-angular-js/ 

http://jsfiddle.net/onury/5gWFL/ 

https://techdev.de/an-angularjs-directive-to-download-pdf-files/ 
+0

Это не работает для меня, спасибо –