2014-11-04 10 views
9

Ich habe ein unerwartetes Verhalten beim Erstellen einer Datei-Download-Funktion auf meinem NodeJS-Server festgestellt. Ich habe eine REST (Express) API, die für einige Exportdatenfunktion ruft, die eine CSV-Datei auf dem Server erstellt und res.download('path/to/file') verwendet, um den Download auszulösen. Response-Header enthaltenContent-Disposition: Anhang wird nicht Download-Dialog ausgelöst

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

so alles in Ordnung zu sein scheint.

Die Sache ist, bekomme ich die Antwort vom Server als Klartext. Die Antwort enthält alle Daten, die in der CSV-Datei enthalten sind, löst jedoch nicht den Dateidownload des Browsers aus, wie ich es beabsichtigt habe. Ich habe sowohl auf Chrome als auch auf FF versucht. Das Problem besteht weiterhin in beiden.

Irgendwelche Ideen?

aktualisiert

Ich konnte es ein Dummy-Formular arbeiten, indem sie zu schaffen und mit ihrer Klage einreichen, um meinen AJAX Anruf. Aber es ist ein hässlicher Hack, und ich suche immer noch nach einer eleganteren Lösung.

Antwort

11

Header sind nicht das Problem. Das Problem besteht darin, dass Sie die Download-URL über einen ajax-Aufruf abfragen, der den Browserdownload-Dialog nicht aufruft. Ihre Optionen gehen auf Folgendes hinaus:

  1. Verwenden Sie ein Formular, das an Ihre Download-URL gesendet wird. Statt eine sichtbare Form hat ein Benutzer mit zu interagieren, ein Formular mit JavaScript erstellen und programmatisch von form.submit Aufruf einreichen - Handle file download from ajax post

  2. Punkt window.location auf die Download-URL. Sie können im aktuellen Fenster dies tun - download file using an ajax request, oder in einer neuen - res.download() not working in my case

+0

Wie Sie in meiner Frage sehen können, ist Option 1, was ich am Ende verwendet habe. Aber ich muss zugeben, dass Option 2 in meinem Fall eine elegantere Lösung ist. – yarons

0

Sie können versuchen, einen anderen Content-Typen zu verwenden, so dass nicht als Textdatei im Browser geöffnet wird:

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

Eine weitere Alternative könnte sein, application/octet-stream als Mime zu verwenden -Typ, um es als eine herunterladbare Datei ohne eine bessere Beschreibung zu definieren.

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

Bereits versucht dies. Hat nicht funktioniert – yarons

Verwandte Themen