2014-11-04 16 views
9

Ho riscontrato alcuni comportamenti imprevisti durante il tentativo di creare una funzionalità di download di file sul mio server NodeJS. Possiedo un'API REST (Express) che richiede una funzione di esportazione dei dati, che crea un file CSV sul server e utilizza res.download('path/to/file') per attivare il download. intestazioni di risposta includonoContent-Disposition: allegato che non attiva la finestra di download

Content-Disposition:attachment; filename="indicators.csv" 
Content-Length:30125 
Content-Type:text/csv; charset=UTF-8 

quindi tutto sembra essere in ordine.

Il problema è che ottengo la risposta dal server come testo normale. La risposta contiene tutti i dati contenuti nel file CSV, ma non attiva la finestra di download del file del browser come volevo. Ho provato entrambi su Chrome e FF. Il problema persiste in entrambi.

Qualche idea?

Aggiornamento

sono riuscito a farlo funzionare con la creazione di una forma fittizia, e con la sua azione presentare per rendere la mia chiamata AJAX. Ma è un brutto trucco, e sto ancora cercando una soluzione più elegante.

risposta

11

Le intestazioni non sono il problema. Il problema è che stai interrogando l'url di download tramite una chiamata ajax, che non invocherà la finestra di download del browser. Le opzioni si riducono a:

  1. Utilizzare un modulo che viene inviato all'URL di download. Invece di avere una forma visibile un utente di interagire con, creare un modulo con JavaScript e la sottopone a livello di codice chiamando form.submit - Handle file download from ajax post

  2. Point window.location per l'URL di download. È possibile farlo nella finestra corrente - download file using an ajax request, o in uno nuovo - res.download() not working in my case

+0

Come puoi vedere nella mia domanda, l'opzione 1 è ciò che ho finito usando. Ma devo ammettere che l'opzione 2 potrebbe essere una soluzione più elegante nel mio caso. – yarons

0

È possibile tenta di utilizzare un diverso tipo di contenuto, in modo che non sarà aperto come file di testo nel browser:

Content-Type:application/ms-excel; charset=UTF-8 

Un'altra alternativa potrebbe essere quella di utilizzare application/octet-stream come mimo -tipo di definirlo come un file scaricabile senza una descrizione migliore.

Content-Type:application/octet-stream; charset=UTF-8 
+0

Già provato. Non ha funzionato – yarons

Problemi correlati