Wie kodiere ich den Dateinamen-Parameter des Content-Disposition-Headers in HTTP?
Web-Anwendungen, zwingen wollen, eine Ressource zu werden heruntergeladen anstatt direkt gerendert in einem Web-browser-Problem ein Content-Disposition
- header in der HTTP-response der form:
Content-Disposition: attachment; filename=FILENAME
Den filename
parameter kann verwendet werden, um vorschlagen, einen Namen für die Datei, in die die Ressource des downloads durch den browser. RFC 2183 (Content-Disposition), doch die Staaten in Abschnitt 2.3 (Der Parameter Dateiname) , den Namen der Datei können nur US-ASCII-Zeichen:
Strom [RFC-2045] Grammatik beschränkt
parameter-Werte (und damit
Content-Disposition Dateinamen)
US-ASCII. Wir erkennen das große
wünschenswert ist, dass beliebige
Zeichensätze in Dateinamen, aber es ist
über den Umfang dieses Dokuments zu
definieren Sie die notwendigen Mechanismen.
Gibt es empirische Beweise, jedoch, dass die meisten gängigen Web-Browsern heute scheinen zulassen von nicht-US-ASCII-Zeichen noch (für das fehlen einer standard -) nicht einverstanden sind, auf die Kodierung und Zeichensatz-Angabe der Datei-name. Frage ist dann, was sind die verschiedenen Schemata und Codierungen eingesetzt, die von den gängigen Browsern, wenn Sie die Datei namens "naïvefile" (ohne Anführungszeichen und wobei der Dritte Buchstabe ist U+00EF), die benötigt werden, kodiert in der Content-Disposition-header?
Für die Zwecke dieser Frage, gängigen Browsern:
- Firefox
- Internet Explorer
- Safari
- Google Chrome
- Oper
InformationsquelleAutor der Frage Atif Aziz | 2008-09-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist eine Auseinandersetzung mit diesen, einschließlich der links zu den browser-Test-und rückwärts-Kompatibilität, die in der vorgeschlagenen RFC 5987"Zeichensatz und Codierung Sprache für Hypertext Transfer Protocol (HTTP) - Header-Feld, - Parameter."
RFC 2183 zeigt, dass solche Header codiert werden sollten nach RFC 2184das wurde überholt von RFC 2231abgedeckt durch den Entwurf der RFC oben.
InformationsquelleAutor der Antwort Jim
Ich weiß, dies ist eine alte post, aber es ist immer noch sehr relevant. Ich habe festgestellt, dass moderne Browser unterstützen rfc5987, die können utf-8-Codierung, Prozentsatz-kodiert (url-encoded). Dann Naiv file.txt wird:
Safari (5) dies nicht unterstützt. Stattdessen sollten Sie die Safari-standard zu schreiben, den Namen der Datei direkt in Ihre utf-8-codierte header:
IE8 und älter nicht unterstützen, und Sie müssen, verwenden Sie den IE-standard utf-8-Codierung, Prozentsatz codiert werden:
In ASP.Net ich verwende den folgenden code:
Getestet habe ich das oben mit IE7, IE8, IE9, Chrome 13, Opera 11, FF5, Safari 5.
Update November 2013:
Hier ist der code, den ich derzeit benutze. Ich habe noch zur Unterstützung des IE8, so dass ich nicht loswerden kann der erste Teil. Es stellt sich heraus, dass die Browser auf Android mit dem eingebauten Android-download-manager, und es kann nicht zuverlässig analysieren Dateinamen in den standard-Weg.
Oben jetzt getestet im IE7-11, Chrome 32, Opera 12, FF25, Safari 6, verwenden diesen Dateinamen für den download: 你好abcABCæøåÆØÅäöüïëêîâéíáóúýñ½§!#¤%&()=`@£$€{[]}+^~'-_,;.txt
IE7 funktioniert es für einige Zeichen, aber nicht alle. Aber wer kümmert sich um den IE7 heute?
Dies ist die Funktion, die ich verwenden, um den sicheren Datei-Namen für Android. Beachten Sie, dass ich nicht weiß welche Zeichen werden unterstützt auf Android, aber, die ich getestet habe, dass diese sicher arbeiten:
@TomZ: ich habe das getestet in IE7 und IE8 und es stellte sich heraus, dass ich nicht brauchen, um zu entkommen apostrophe ('). Hast du ein Beispiel, wo es scheitert?
@Dave Van den Eynde: die Kombination der beiden Datei-Namen in einer Zeile als nach RFC6266 funktioniert, außer für Android und IE7+8 und ich habe aktualisiert, der code, um dies zu reflektieren. Danke für die Anregung.
@Thilo: Keine Ahnung, GoodReader oder einer anderen nicht-browser. Sie haben vielleicht einige Glück mit dem Android-Ansatz.
@Alex Zhukovskiy: ich weiß nicht warum, aber, wie besprochen, auf Verbinden es scheint nicht zu funktionieren sehr gut.
InformationsquelleAutor der Antwort Martin Ørding-Thomsen
Gibt es keine interoperablen Weise zu Kodieren, die nicht-ASCII-Namen in
Content-Disposition
. Browser-Kompatibilität ist ein Chaos.Den theoretisch korrekte syntax für die Verwendung von UTF-8 in
Content-Disposition
ist sehr komisch:filename*=UTF-8''foo%c3%a4
(ja, das ist ein Stern, und keine Zitate, außer eine leere single-quote in der Mitte)Dieser header ist irgendwie-nicht-ganz-standard (HTTP/1.1 spec anerkennt seine Existenzaber nicht erforderlich ist, Kunden zu unterstützen).
Gibt es eine einfache und sehr robuste alternative: einen URL verwenden, die enthält den Dateinamen, den Sie wollen.
Wenn der name nach dem letzten Schrägstrich ist die, die Sie wollen, Sie brauchen keine extra Header!
Dieser trick funktioniert:
Und wenn es dein server unterstützt URL rewriting (z.B.
mod_rewrite
im Apache), dann kannst du komplett ausblenden, der Skript-Teil.Zeichen in URLs sollten in UTF-8, urlencoded byte-by-byte:
InformationsquelleAutor der Antwort Kornel
RFC-6266 beschreibt die "die Verwendung des Content-Disposition-Header-Feld im HTTP (Hypertext Transfer Protocol)". Zitiert aus:
Und in Ihrer im Abschnitt "Beispiele":
In Anhang D es gibt auch eine lange Liste von Vorschlägen, um die Interoperabilität zu erhöhen. Es verweist auch auf eine Website vergleicht Implementierungen. Aktuelle all-pass-tests geeignet für die gemeinsame Datei-Namen sind:
filename
" - parameter.Dass RFC 5987 wiederum Verweise RFC 2231die beschreibt das eigentliche format. 2231 ist in Erster Linie für E-mail und 5987 sagt uns, welche Teile verwendet werden können, für HTTP-Header als gut. Verwechseln Sie dies nicht mit MIME-Headern verwendet, innen ein
multipart/form-data
HTTP Körperdie regiert wird von RFC 2388 (Abschnitt 4.4 im besonderen) und die HTML-5-Entwurf.InformationsquelleAutor der Antwort MvG
Dem folgenden Dokument verknüpft, aus der Entwurf RFC erwähnt Jim in seiner Antwort weiter befasst sich mit der Frage und auf jeden Fall einen direkten Hinweis hier:
Testfälle für HTTP-Content-Disposition-header in RFC 2231/2047 Codierung
InformationsquelleAutor der Antwort Atif Aziz
in asp.net mvc2 ich so etwas wie dieses:
Ich denke, wenn Sie es nicht verwenden, mvc(2), konnte man nur codieren, die mit dem Namen mit
InformationsquelleAutor der Antwort Elmer
Ich verwende den folgenden code-snippets für die Codierung (vorausgesetzt mit dem Namen enthält den Dateinamen und die Erweiterung der Datei, also: test.txt):
PHP:
Java:
InformationsquelleAutor der Antwort Vassilen Dontchev
In ASP.NET Web-API, ich url-codieren, die mit dem Namen:
InformationsquelleAutor der Antwort martinoss
Setzen Sie die Dateinamen in doppelte Anführungszeichen. Das problem bei mir gelöst. Wie diese:
http://kb.mozillazine.org/Filenames_with_spaces_are_truncated_upon_download
InformationsquelleAutor der Antwort Dmitry Kaigorodov
Getestet habe ich den folgenden code in allen gängigen Browsern, einschließlich älterer Explorers (über den compatibility mode), und es funktioniert überall gut:
InformationsquelleAutor der Antwort Stano
Wenn Sie mit einem nodejs-backend können Sie den folgenden code, den ich gefunden hier
InformationsquelleAutor der Antwort Emanuele Spatola
Landete ich mit dem folgenden code in meine "download.php" Skript (basierend auf dieser Beitrag und diese Testfälle).
Diese nutzt die standard-Weg, filename="..." solange es sind nur iso-latin1 und der "safe" - Zeichen verwendet; wenn nicht, dann wird der filename*=UTF-8" url-codiert Weg. Nach in diesem speziellen Testfallsollte es von der MSIE9, und auf den letzten FF, Chrome, Safari; auf der unteren MSIE version soll es bieten, mit dem Namen mit dem ISO8859-1-version der Dateinamen mit Unterstrichen auf Zeichen, die nicht in dieser Codierung.
Letzte Anmerkung: die max. Größe für jedes header-Feld ist 8190 Byte auf apache. UTF-8 kann bis zu vier bytes pro Zeichen; nach rawurlencode, es ist x3 = 12 bytes pro Zeichen. Ziemlich ineffizient, aber es sollte doch theoretisch möglich, dass mehr als 600 "lächelt" %F0%9F%98%81 im Dateinamen.
InformationsquelleAutor der Antwort renergy
In PHP-dies hat es für mich (vorausgesetzt, das mit dem Namen ist UTF8-codiert):
Geprüft mit IE8-11, Firefox und Chrome.
Wenn der browser interpretieren kann filename*=utf-8 wird die UTF8-version des mit dem Namen, sonst wird es mit dem dekodierten mit dem Namen. Wenn Ihr Dateiname enthält Zeichen, die nicht dargestellt werden in ISO-8859-1 möchten Sie vielleicht zu prüfen, mit
iconv
statt.InformationsquelleAutor der Antwort Gustav
Klassischen ASP-Lösung
Meisten modernen Browser unterstützen die Weitergabe der
Filename
alsUTF-8
jetzt, aber wie war der Fall mit einem Datei-Upload-Lösung, die ich verwenden, basierend auf FreeASPUpload.Net (Website existiert nicht mehr, der link verweist auf archive.org) es würde nicht funktionieren, da das Parsen der binären stützte sich auf das Lesen von Einzel-byte-ASCII-codierten Zeichenketten, die geklappt, wenn Sie übergeben UTF-8-kodierte Daten bis zu ASCII-Zeichen nicht unterstützt.Aber ich war in der Lage, eine Lösung zu finden um den code zum Einlesen und Parsen der binären als UTF-8.
Kredit geht an Reine ASP-Datei-Upload durch die Umsetzung der
BytesToString()
Funktion voninclude_aspuploader.asp
in meinem eigenen code, den ich war in der Lage zu bekommenUTF-8
Dateinamen arbeiten.Nützliche Links
Multipart/form-data und UTF-8 in einer ASP-Classic-Anwendung
Unicode, UTF, ASCII -, ANSI-format Unterschiede
InformationsquelleAutor der Antwort Lankymart
Wir hatten ein ähnliches problem in einer Webanwendung, und landete durch das Lesen der Dateinamen aus dem HTML -
<input type="file">
und Einstellung, die in der url-codierte form in eine neue HTML -<input type="hidden">
. Natürlich mussten wir entfernen den Weg, wie "C:\fakepath\" zurückgegeben wird, die von einigen Browsern.Natürlich nicht direkt beantworten OPs Frage, aber kann eine Lösung sein für andere.
InformationsquelleAutor der Antwort Andrei I
Ich normalerweise URL-encode (mit %xx) in den Dateinamen, und es scheint zu funktionieren in allen Browsern. Möchten Sie vielleicht tun einige tests sowieso.
InformationsquelleAutor der Antwort Dario Solera
Fand ich out-Lösung, die funktioniert für alle meine Browser (ie. alle Browser habe ich installiert - IE8, FF16, Opera 12, Chrome 22).
Meine Lösung ist beschrieben im anderen thread:
Java-servlet-download mit dem Namen Sonderzeichen
Meine Lösung basiert auf der Tatsache, wie Browser versucht zu Lesen Wert von
filename
parameter. Wenn kein charset angegeben in derfilename
parameter (zum Beispielfilename*=utf-8''test.xml
) Browser erwarten, der Wert ist kodiert in der browser-native Codierung.Verschiedenen Browsern erwarten, dass verschiedene native Codierung. In der Regel browser-native Codierung ist utf-8 (FireFox, Opera, Chrome). Aber IE native Codierung ist Win-1250. (Ich weiß nicht, etwas über andere Browser.)
Daher, wenn wir setzen Wert in
filename
parametr, kodierte utf-8/win-1250 nach browser des Benutzers, sollte es funktionieren. Zumindest, es funktioniert für mich.Kurz, wenn wir die Datei namens
omáčka.xml
,für FireFox, Opera und Chrome habe ich diese Antwort-header (utf-8-codiert):
und für den IE habe ich diese Antwort-header (codiert in win-1250):
Java-Beispiel ist in meinem postdie oben erwähnt sind.
InformationsquelleAutor der Antwort sporak