2016-04-13 11 views
1

Ich habe einen eckigen Service. Ich sende eine Anfrage mit $ Ressource an meine API. Die API sendet eine Datei, die heruntergeladen werden soll. Wie speichere ich es?

HINWEIS: Meine API sendet bereits Header, die den Browser zum Herunterladen der Datei veranlassen.

Wenn ich direkt über den Browser auf die API zugreife, wird die Datei heruntergeladen. ABER, wenn ich auf die API von $ resource zugreife, passiert nichts.

API:

res.writeHead(200, { 
    'Content-Type': 'application/octet-stream', 
    "content-disposition": "attachment;" 
}); 
res.end(fileText); 
+0

Welche Anforderungstyp ist es? Wenn es GET ist, versuche das Download-Attribut für einen Link zu verwenden. – dfsq

+0

GET, POST hat nicht funktioniert. Attribut herunterladen? –

Antwort

1

UPDATE:

ich eine Gesamtarbeits Lösung gefunden habe, und im Gegensatz zu der alten Antwort, es funktioniert auf IE und FF:

var blob = new Blob([response], {type: 'text/json'}); 

// FOR IE: 
if (window.navigator && window.navigator.msSaveOrOpenBlob) { 
    window.navigator.msSaveOrOpenBlob(blob); 
} 

// For Other browsers (tested on Chrome, FF) 
else{ 
    var e = document.createEvent('MouseEvents'), 
     a = document.createElement('a'); 

    a.download = filename; 
    a.href = window.URL.createObjectURL(blob); 
    a.dataset.downloadurl = ['text/json', a.download, a.href].join(':'); 
    e.initEvent('click', true, false, window, 
     0, 0, 0, 0, 0, false, false, false, false, 0, null); 
    a.dispatchEvent(e); 
} 

Alte Antwort:

Dank topless um mich zu einer richtigen Antwort zu führen. Hier ist, wie ich es funktionierte:

myService.exportData().$promise.then(function (response) { 
    var anchor = angular.element('<a/>'); 
    anchor.attr({ 
     href: 'data:attachment/json,' + encodeURI(JSON.stringify(response)), 
     target: '_blank', 
     download: 'exported logs.log' 
    })[0].click(); 

}) 

Auch, jetzt muss ich nicht die Header auf der API-Seite. res.send(myFileText) funktioniert gut!

HINWEIS: ARBEITEN IN IE NICHT & SAFARI

+1

Das einzige Problem ist, dass es nicht in IE und Safari funktioniert. – dfsq

1

Versuchen Sie einen Dateinamen bereitstellt, wenn sie eine json Art sonst content-type entsprechend ändern.

"Content-Type": 'application/json' 
"content-disposition": "attachment;filename=fname.json" 
+0

Nein, immer noch nichts. Es funktioniert, wenn direkt vom Browser zugegriffen wird, ohne Dateiname geben –

+1

Können Sie versuchen, [dies] (http://stackoverflow.com/questions/20904151/download-text-csv-content-as-files-from-server-in) -angular) oder besser noch die elegantere und einfachere Antwort wie [this] (http://stackoverflow.com/questions/17836273/export-javascript-data-to-csv-file-without-server-interaction)? – topless

+0

Ich versuche eine Blob-Lösung, aber das scheint kein geeigneter Weg zu sein. Versuchen Sie es auch zu versuchen –

Verwandte Themen