Download von Dateien mit Umlauten im Dateinamen

Django, Flask, Bottle, WSGI, CGI…
Antworten
MarcV
User
Beiträge: 11
Registriert: Dienstag 12. Juli 2016, 15:49

Liebes Forum,

als Flask-Neuling schlage ich mich mit einem Umlaute-Problem herum und weiß nicht genau, wo ich ansetzen muss.
Ich habe eine kleine Suchmaschine geschrieben, die ca. 5.000 Word-Dateien, die auf einem Server Laufwerk liegen und unter /static/ gemounted sind nach einem Suchbegriff durchsucht und Dateinamen als Ergebnis zurück gibt.

Die Benutzung der Suche erfolgt im Intranet mit Flask. Als Ergebnis gebe ich die Dateinamen als Links in einer Tabelle aus.

Die Links sehen so aus: "http://local.XY.de/get-VB/Das neue Haus (2019).docx"

Bis hierhin funktioniert alles wunderbar.

Den Aufruf der Dateien zum Download steuere ich so:

@app.route("/get-VB/<path:path>")
def get_vb(path):
try:
return send_from_directory(app.config["VB"], filename=path, as_attachment=True)
except FileNotFoundError:
abort(404)

Für folgende Dateinamen ohne Umlaut funktioniert alles wunderbar: "Das neue Haus (2019).docx". Die Datei wird geladen und alles ist gut.
Leider funktioniert das mit Umlauten nicht: "Die neue Hütte (2019).docx"

Sicherlich muss ich irgendwo codieren und decodieren. Da die Dateien teilweise Umlaute im Namen haben, benötige ich auch Umlaute im entsprechenden Aufruf. Auf flask oder Browser-Ebene kann ich aber anscheinend nicht mit Umlauten arbeiten.

Kann mir hier jemand auf die Sprünge helfen?

Vielen Dank!!!

Marc
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Dateinamen in URLs muss man codieren, mit urllib.parse.quote bzw. urllib.parse.unquote.
MarcV
User
Beiträge: 11
Registriert: Dienstag 12. Juli 2016, 15:49

@Sirius3: Vielen Dank für den Hinweis auf auf urllib.parse.quote bzw. urllib.parse.unquote!!!

Die Umwandlung bekomme ich hin, eider verstehe ich das Zusammenspiel zwischen html, Browser und Flask noch nicht richtig.
An welcher Stelle im Code muss ich urllib.parse.quote und wo urllib.parse.unquote anenden?
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn du Dateinamen in URLs einbinden willst quote umgekehrt unquote wo du path verwendest.
MarcV
User
Beiträge: 11
Registriert: Dienstag 12. Juli 2016, 15:49

Ok, vielen Dank, jetzt habe ich die URL für den Link folgendermaßen generiert: URL = quote(Dateiname, encoding="UTF-8")
Das Ergebnis sieht auch gut aus: Onkel%20Toms%20H%C3%BCtte.docx

Dann versuche ich das ganze in der anderen Richtung:
@app.route("/get-VB/<path:Dateiname>")
def get_vb(Dateiname):
try:
Dateiname = unquote(Dateiname, encoding="UTF-8")
return send_from_directory(app.config["VB"], filename=Dateiname, as_attachment=True)
except FileNotFoundError:
abort(404)

Leider kommt dann wieder ein Fehler!
Irgendwas mache ich hier noch falsch. Habe zuerst versucht encoding="latin-1" zu setzen, das gab dann einen Fehler beim encoding.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Was für ein Fehler kommt denn? Stimmt denn der Dateiname?
MarcV
User
Beiträge: 11
Registriert: Dienstag 12. Juli 2016, 15:49

Ganz lieben Dank für Deine Hilfe!!!

Ich erhalte: 500 Internal Server Error

Interessant ist, dass Chrome mir bei der Fehlermeldung den folgenden Link anzeigt:
"http://local.XY.de/get-VB/Onkel%20Toms%20Hütte.docx" , obwohl der Link "http://local.XY.de.de/get-VB/Onkel%20To ... BCtte.docx" lautet.
Wenn ich nur mit der Maus über den Link fahre, wird mir wiederum "http://local.XY.de/get-VB/Onkel Toms Hütte.docx" angezeigt, was dem richtigen Dateinamen entsprechen würde.

Sehr komisch!
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Fehler 500 ist das, was im Browser erscheint.
Aber welcher Fehler gibt denn dein Webserver aus?
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich vermute mal sehr stark das man kein unquote braucht, denn so etwas würde ich vom Webrahmenwerk erwarten.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
MarcV
User
Beiträge: 11
Registriert: Dienstag 12. Juli 2016, 15:49

Sorry, WebProgrammierung ist nicht meine normale Aufgabe, daher kenne ich mich mit Webservern nicht wirklich aus!
Die folgenden Einträge habe ich in den Apache2-Logs gefunden:

FlaskApp-access.log
000.000.000.000 - - [18/Aug/2020:19:20:47 +0200] "GET /favicon.ico HTTP/1.1" 404 429 "http://local.XY.de/get-VB/Onkel%20Toms% ... BCtte.docx" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36"

FlaskApp-error.log
[Tue Aug 18 19:20:47.080515 2020] [wsgi:error] [pid 9901:tid 139943531742976] [client IP:51738] , referer: http://local.XY.de/VBsearch/

error.log
[Tue Aug 18 19:11:01.805077 2020] [core:notice] [pid 9898:tid 139943785292992] AH00094: Command line: '/usr/sbin/apache2'
MarcV
User
Beiträge: 11
Registriert: Dienstag 12. Juli 2016, 15:49

__blackjack__ hat geschrieben: Dienstag 18. August 2020, 18:48 Ich vermute mal sehr stark das man kein unquote braucht, denn so etwas würde ich vom Webrahmenwerk erwarten.
Das habe ich schon probiert. Ohne unquote geht es leider auch nicht!
Trotzdem Danke!
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Error 500 sagt ja, dass irgendeine Exception auftreten ist. Dann wäre es auch gut, dessen Traceback zu sehen. Starte mal Flask mit debug=True.
MarcV
User
Beiträge: 11
Registriert: Dienstag 12. Juli 2016, 15:49

Sirius3 hat geschrieben: Dienstag 18. August 2020, 19:30 Error 500 sagt ja, dass irgendeine Exception auftreten ist. Dann wäre es auch gut, dessen Traceback zu sehen. Starte mal Flask mit debug=True.
Danke für den Hinweis. In unserem kleinen Unternehmen habe ich bisher direkt auf dem operativen Server weiterentwickelt.
Also nun zum Testen noch einmal auf das MacBook gezogen und auf dem integrierten Testserver laufen gelassen.

Brat mir einen Storch! Es funktioniert ohne Fehler und ganz unabhängig von quote/unquote. Alle Files werden ordnungsgemäß geladen!

Wie kann es sein, dass es auf dem Testserver funktioniert und auf dem produktiven Server nicht?
Kenne mich in der Administration von Webservern nicht aus. Kann es sein, dass Einstellungen des Apache-Servers hier zicken und das zu Problemen bei den Umlauten führt???
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum etwas zufällig funktioniert kann viele Gründe haben. Der Zeichensatzvbei URLs ist eingeschränkt und alle Sonderzeichen müssen daher kodiert werden. Glücklicherweise hast du den Fehler auf dem Produktivsystem sofort entdeckt. Du musst halt auf einem System debuggen, das den Produktivsystem möglichst ähnlich ist. Vor allem identische Python-Umgebung.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Und ohne die Fehlermeldung vom Produktivsystem wirst du gar nicht debuggen können.
MarcV
User
Beiträge: 11
Registriert: Dienstag 12. Juli 2016, 15:49

Ja, das hast Du Recht! Bin mir nicht sicher, ob ich das schaffe. Übersteigt dann doch leider meine Fähigkeiten!
Ich werde einmal sehen, ob ich einen Programmierer finde, der in den Code einsteigt und mir helfen kann.
Vielen Dank an alle hier!!!
Antworten