2016-11-18 1 views
0

Ich möchte einen Node/Express-Server verwenden, um eine Datei als Anhang zum Client zu streamen. Ich möchte eine asynchrone Anfrage vom Client an einen /download Endpunkt machen und dann ein Objekt, das über den API-Proxy empfangen wurde, als herunterladbare Datei an den Client senden (ähnlich wie sich res.attachment(filename); res.send(body); verhält).Verwenden von Node/Express, um Datei zum Benutzer zum Download zu streamen

Zum Beispiel:

fetch(new Request('/download')) 
    .then(() => console.log('download complete')) 

app.get('/download', (req, res, next) => { 
    // Request to external API 
    request(config, (error, response, body) => { 
     const jsonToSend = JSON.parse(body); 
     res.download(jsonToSend, 'filename.json'); 
    }) 
}); 

Das wird nicht funktionieren, weil res.download() nur einen Pfad zu einer Datei akzeptiert. Ich möchte die Antwort von einem Objekt im Speicher senden. Wie ist das mit bestehenden Node/Express APIs möglich?


Einstellen der entsprechenden Header nicht als Download angeboten werden, entweder:

res.setHeader('Content-disposition', 'attachment; filename=filename.json'); 
    res.setHeader('Content-type', 'application/json'); 
    res.send({some: 'json'}); 

Antwort

1

Das funktionierte für mich. Ich verwende den Inhaltstyp Oktettstream, um den Download zu erzwingen. auf Chrom Getestet die json als ‚data.json‘ heruntergeladen wurde
Sie nicht den Download mit Ajax machen können nach: Handle file download from ajax post

Sie können eine href/window.location/location.assign verwenden. Dieser Browser wird den MIME-Typ application/octet-stream erkennen und die tatsächliche Seite nicht nur den Download auslösen, so dass Sie einen Ajax-Erfolg Anruf wickeln können.

//client 
const endpoint = '/download'; 

fetch(endpoint, { 
    method: 'POST', 
    credentials: 'include', 
    headers: { 
    'Accept': 'application/json', 
    'Content-Type': 'application/json' 
    } 
    }) 
    .then(res => res.json()) 
    .then(res => { 
    //look like the json is good to download 
    location.assign(endpoint); 
    }) 
    .catch(e => { 
    //json is invalid and other e 
    }); 

//server 
const http = require('http'); 

http.createServer(function (req, res) { 
    const json = JSON.stringify({ 
     test: 'test' 
    }); 
    const buf = Buffer.from(json); 
    res.writeHead(200, { 
     'Content-Type': 'application/octet-stream', 
     'Content-disposition': 'attachment; filename=data.json' 
    }); 
    res.write(buf); 
    res.end(); 
}).listen(8888); 
+0

Sieht aus, als ob Sie aus der Datei 'data.json' lesen. Wie kann ich dasselbe Verhalten ausführen und ein einfaches Objekt '{" einige ":" json "}' senden? – Himmel

+0

Welche Header haben Sie vom Client aufgenommen? – Himmel

+0

Ich bearbeite den Code, den es zum Download eines serialisierten JSON aber nicht als Stream macht. – mrdotb

Verwandte Themen