2016-05-16 5 views
1

Ich versuche Inhalt Disposition-Header zu setzen individuelle Dateinamen zu erhalten, während in IE das Herunterladen von Dateien durchführen 11.IE 11 nicht analysiert HTTP Content Disposition-Header richtig

Ich habe extrem seltsames Verhalten im IE 11 konfrontiert: wenn Escape (U + 001B) char ist im Dateinamen der Content Disposition Header IE 11 kann nicht richtig Dateinamen (in Content Disposition Header) zur Verfügung gestellt. Zum Beispiel content_disposition mit formatiertem file_name_1 löst 11 Fehler IE, aber mit file_name_2 Formatierung ist in Ordnung:

# There are invisible control character escape (U+001B) 
name = u'_$B!' 
file_name_1 = quote(name) # gives "_%1B%24B%21" 
file_name_2 = "_%24B%21.pdf" 
content_disposition = "attachment; filename*=utf-8''%s" % file_name_2 

Gibt es irgendwelche Möglichkeiten, Unterstützung jegliche utf8 Dateinamen in IE11 zur Verfügung zu stellen.

Hinweis: In allen anderen Browsern zu funktionieren scheint alles und ich hoffe, es gibt Art und Weise, ohne zu brechen andere Browser IE 11 Verhalten zu beheben ...

+0

Ich verstehe nicht - warum Möchte man überhaupt ein * unsichtbares * Zeichen in einem Dateinamen? Dies könnte ein Sicherheitsfilter sein. –

+0

@Pekka 웃 Ort spielt keine Rolle dort% 1B könnte irgendwo im Dateinamen sein, das Problem ist, dass im Fall, wenn% 1b vorhanden ist - der Dateiname würde falsch angezeigt werden. Außerdem kann ich Daten nicht kontrollieren, die ich als Dateiname setzen würde. –

+0

Welchen Dateinamen erhalten Sie stattdessen in IE11? –

Antwort

1

Es wird empfohlen, die Steuerzeichen vor dem Erstellen der Kopfzeile der Inhaltsdisposition zu entfernen (weitere Informationen in der @JulianReschke-Antwort).

Control codes in Python mit list comprehension und ord leicht abgestreift werden:

# There are invisible control character escape (U+001B) 
name = u'_$B!' 
# All chars with ord(s) <= 31 is a control characters. 
name = "".join(i for i in name if ord(i) > 31) 

So nach oben in die Codezeile hinzufügen, alles begann gut zu funktionieren:

name = u'_$B!' 
# Strip control codes 
name = "".join(i for i in name if ord(i) > 31) 

file_name_1 = quote(name) # gives "_%1B%24B%21" 
file_name_2 = "_%24B%21.pdf" 
content_disposition = "attachment; filename*=utf-8''%s" % file_name_2 
2

Nicht Zeichen wie diese Annahme ist eigentlich das, was die Spezifikation empfiehlt . Siehe https://greenbytes.de/tech/webdav/rfc6266.html#rfc.section.4.3.p.5:

"Empfänger sollten Zeichenfolgen abziehen oder ersetzen, von denen bekannt ist, dass sie sowohl in Benutzeroberflächen als auch in Dateinamen Verwirrung stiften, wie Steuerzeichen und führende und nachfolgende Leerzeichen."

Natürlich könnte man argumentieren, dass die verbleibenden Zeichen irgendwie besser wären, aber der wichtige Punkt ist, dass Benutzeragenten empfohlen werden, Steuerzeichen zu entfernen.

+0

Sie haben recht, am wahrscheinlichsten werde ich Kontrollzeichen abziehen, wenn ich keine andere Option bekommen würde –