2014-10-09 7 views
12

Contesto: app Node.js multilivello con Express. Front-end ospitato come sito Web di Azure, i dati di back-end provengono da Parse.Come inviare un file dall'URL remoto come risposta GET nell'app Node.js Express?

Ho un endpoint GET e voglio che l'esperienza utente sia un download di file. Se il file vissuto nello stesso server come il mio front-end, ho potuto utilizzare

res.sendfile(localPath); 

Tuttavia, il file è ospitato dal mio back-end su un altro server e tutta la mia estremità anteriore conosce è l'URL. Così sto facendo attualmente:

res.redirect(externalURL); 

Ciò si traduce nel browser navigazione verso l'URL del file risorsa (che è un video) e visualizza nel browser. Quello che voglio sapere è: come fare per scaricare il file da quel file e rimanere nella stessa pagina?

Ho cercato in giro per un po 'su questo e non vedo un modo di farlo senza prima scaricare il file in un file temporaneo sul mio front-end, che ovviamente preferirei non fare. Questo è probabilmente roba HTTP 101 quindi apprezzo qualsiasi aiuto!

+0

L'utente può raggiungere questa pagina da un suo collegamento? È possibile utilizzare un attributo in questo caso: "". Altrimenti, dovrai eseguire il proxy. – Ryan

+0

Sto servendo la pagina che ha il link che origina la richiesta che sto cercando di convertire in un download. Ho usato il metodo descritto da Mike S in basso per ottenere l'UX che sto cercando qui. Il risultato è comunque il trasferimento della risorsa due volte, quindi se qualcuno sa come ottenere questo UX senza il doppio trasferimento lo apprezzerò. – BillyRayCyrus

risposta

20

È possibile utilizzare la funzione http.request() per effettuare una richiesta al proprio externalURL e quindi a la risposta a res. L'utilizzo di pipe() invierà il file tramite il server al browser, ma non lo salverà su disco in nessun punto. Se si desidera che il file venga scaricato (diversamente da essere visualizzato nel browser), sarà necessario impostare content-disposition header.

Ecco un esempio di server che "scaricherà" il logo di google. Questo è solo utilizzando il modulo standard http e non di esprimere, ma dovrebbe funzionare sostanzialmente allo stesso modo:

var http = require('http'); 

http.createServer(function(req, res) { 
    var externalReq = http.request({ 
     hostname: "www.google.com", 
     path: "/images/srpr/logo11w.png" 
    }, function(externalRes) { 
     res.setHeader("content-disposition", "attachment; filename=logo.png"); 
     externalRes.pipe(res); 
    }); 
    externalReq.end(); 
}).listen(8080); 

Se si desidera utilizzare il modulo request, è ancora più facile:

var http = require('http'), 
    request = require('request'); 

http.createServer(function(req, res) { 
    res.setHeader("content-disposition", "attachment; filename=logo.png"); 
    request('http://google.com/images/srpr/logo11w.png').pipe(res); 
}).listen(8080); 

Nota: Il nome del file che il browser salva è impostato dalla parte dell'intestazione content-disposition; in questo caso l'ho impostato su logo.png.

+1

La richiesta + pipe funzionava alla grande. Il mio codice è il seguente: 'res.setHeader (" content-disposition "," attachment; filename = "+ filename); richiesta (videoUrl) .pipe (res); ' – BillyRayCyrus

Problemi correlati