2017-02-15 33 views
0

Ich muss eine große Datei von eckigen herunterladen. Ich habe einen Link und wenn der Client klickt, muss die Datei heruntergeladen werden. -Code in Controller:AngularJs, große Dateien herunterladen

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

Es ist für kleine Dateien arbeitet (300Mb), aber mit großen Dateien (800MB) funktioniert nicht. Ich müsste Dateien bis 4 GB herunterladen. Und mit dem Hauptbrowser (Chrome, Mozilla und Safari). Weil ich in jimmywarting/StreamSaver.js eine Lösung gesehen habe (Nicht getestet) aber nur für Chrome und Opera.

I Knoten Js verwenden im Backend, ist der Code:

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

Dank.

Antwort

1

Schließlich beschloss ich, es Token Hinzufügen zu api url und Anfrage.

html:

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

Controller hinzufügen param 'token' url.

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

app.js in Knoten Js, um Token von URL zu erhalten. Standardmäßig nur aus dem Header übernehmen. Ich benutze 'Express-JWT' Modul. Und das Token ist: 'Bearer 23f334f ... Token ... 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 Anfrage in Knoten JS. 'NameFile' ist der Name der heruntergeladenen Datei und 'pathFile' ist der Pfad, unter dem sich die Datei befindet.

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

Try this:

ersetzen

a.href = fileURL; 

zu

window.location.href = fileURL; 
+0

Nicht funktioniert, Fehler "Keine Webpage für BLOB-Adresse gefunden". Danke –

+0

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

+0

window.location.href = data; den ganzen Code ersetzen? –

0

Siehe unten verbindet es gute Erklärung gibt.

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

Es funktioniert nicht für mich, danke –