2017-01-09 4 views
0

Ich habe ein kleines Projekt, das einige Dateien beantworten muss. Ich weiß, dass die Verwendung von nginx bessere Entscheidung sein wird, aber dass die Dateien sehr klein sind.Wie ändert sich der Name des Downloads in der Flasche?

Teil meines Programms:

return send_file(os.path.join(filepath, filename)) 

Diese Zeile gibt die Datei, die Dateinamen wie download ohne Format oder etwas ähnliches hat. Der Dateiname, der heruntergeladen wurde, ist immer gleich und hängt nicht vom richtigen Namen der Datei ab. Der tatsächliche Dateiname lautet table.csv. Wie kann ich die Datei mit dem korrekten Dateinamen zurückgeben?

+2

Set 'as_attachment = true' für' send_file' die erforderliche HTTP-Header zu setzen, und stellen Sie 'attachment_filename', wenn Sie einen anderen Namen aus dem einen verwenden möchten bereits Legen Sie das Dateiobjekt fest. –

Antwort

8

Sie müssen einen HTTP-Header Content-Disposition: attachment; filename=.... festlegen, damit der Browser den korrekten Dateinamen verwendet.

Sie können send_file() diesen Header für Sie festlegen, indem Sie das as_attachment=True Argument festlegen. Der Dateiname wird dann aus dem Dateiobjekt genommen Sie in geben Verwenden Sie das attachment_name Argument explizit einen anderen Dateinamen gesetzt:

return send_file(os.path.join(filepath, filename), as_attachment=True) 

Vom flask.send_file documentation:

  • as_attachment - auf True. wenn Sie diese Datei mit einem Content-Disposition: attachment Header senden möchten.
  • attachment_filename - der Dateiname für den Anhang, wenn dieser vom Dateinamen der Datei abweicht.

Sie können die flask.send_from_directory() function stattdessen verwenden möchten. Diese Funktion stellt zuerst sicher, dass der Dateiname existiert (wodurch eine NotFound ausgelöst wird, falls nicht) und stellt sicher, dass der Dateiname keine relativen Elemente enthält, die zum "Entkommen" des Verzeichnisses verwendet werden könnten. Verwenden Sie diese Option für alle Dateinamen aus nicht vertrauenswürdigen Quellen stammen:

return send_from_directory(filepath, filename, as_attachment=True) 
Verwandte Themen