Java-servlet-download mit dem Namen Sonderzeichen
Schreibe ich eine einfache Datei-download-servlet und ich bekomme keine richtigen Dateinamen. Versucht URLEncoding und MimeEncoding die mit dem Namen, wie gesehen in den vorhandenen Antworten, aber keiner von Ihnen arbeitete.
Das fileData-Objekt in den folgenden Codefragment enthält den mime-type, byte[] content und der Dateinamen muss mindestens die ISO-8859-2 Zeichensatz ISO-8859-1 ist nicht genug.
Wie kann ich meine browser zum anzeigen der heruntergeladenen Dateinamen korrekt?
Hier ist ein Beispiel für den Dateinamen: árvíztűrőtükörfúrógép.xls und das Ergebnis: árvíztqrptükörfúrógép.xls
protected void renderMergedOutputModel(Map model, HttpServletRequest req, HttpServletResponse res) throws Exception {
RateDocument fileData = (RateDocument) model.get("command.retval");
OutputStream out = res.getOutputStream();
if(fileData != null) {
res.setContentType(fileData.getMime());
String enc = "utf-8"; //tried also: ISO-8859-2
String encodedFileName = fileData.getName();
//also tried URLencoding and mime encoding this filename without success
res.setCharacterEncoding(enc); //tried with and without this
res.setHeader("Content-Disposition", "attachment; filename=" + encodedFileName);
res.setContentLength(fileData.getBody().length);
out.write(fileData.getBody());
} else {
res.setContentType("text/html");
out.write("<html><head></head><body>Error downloading file</body></html>"
.getBytes(res.getCharacterEncoding()));
}
out.flush();
}
Bitte geben Sie einige Beispiele, wie die Dateinamen Aussehen und was Sie stattdessen bekommen.
árvíztűrőtükörfúrógép.xls --> árvíztqrptükörfúrógép.xls
Ja, du hast Recht. Diese beiden Zeichen nicht in ISO-8859-1 nur in ISO-8859-2, verursacht viele Probleme für jeden ungarischen Entwickler.. 🙂
árvíztűrőtükörfúrógép.xls --> árvíztqrptükörfúrógép.xls
Ja, du hast Recht. Diese beiden Zeichen nicht in ISO-8859-1 nur in ISO-8859-2, verursacht viele Probleme für jeden ungarischen Entwickler.. 🙂
InformationsquelleAutor jabal | 2011-03-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich heraus-Lösung, die in allen Browsern funktioniert habe ich installiert (IE8, FF16, Opera12, Chrome22).
Es basiert auf der Tatsache, dass Browser erwarten-Wert in filename-parameter, die codiert ist in native Browser-Codierung, wenn nicht [anders] Codierung angegeben ist.
In der Regel browser-native Codierung ist utf-8 (FireFox, Opera, Chrome). Aber IE native Codierung ist Win-1250.
Wenn wir also Wert mit dem Namen parametr, kodierte utf-8/win-1250 nach browser des Benutzers, sollte es funktionieren. Zumindest, es funktioniert für mich.
Natürlich, das ist getestet nur auf Browsern, die oben erwähnt und ich kann nicht garantieren 100%, dass dies in jedem browser funktionieren alle Zeit.
Hinweis #1 (@gefallenen):
Es ist nicht korrekt zu verwenden URLEncoder.encode () - Methode. Trotz der Methode den Namen, die es nicht codieren string in URL-Kodierung, aber es tut Kodieren in form-Codierung. (Formular-encoding ist sehr ähnlich zu URL-encoding und in vielen Fällen produziert die gleichen Ergebnisse. Aber es gibt einige Unterschiede. Zum Beispiel Leerzeichen '' kodiert ist anders: '+' anstelle von '%20')
Für die korrekte URL-codierte Zeichenfolge, die Sie verwenden sollten, URI-Klasse:
IE native Codierung ist Mittel - /Osteuropa-code Seite? Sie müssen scherzen. Das einzige was es zeigt ist, dass der IE die lokale browser-Gebietsschema. Leider, ich glaube nicht, dass es eine zuverlässige Möglichkeit zum erkennen aus dem server.
Warum funktioniert das? Wenn die original -
fileName
ist nur ein einzelnes Zeichen, zum Beispielő
, dannfileName.getBytes("UTF-8")
zurückkehren wird ein byte-array mit zwei Elementen0xC5 0x91
. Die oben genannte Lösung loops über diese zwei bytes und fügt Sie zu einem neuen string. Diese neue saite wird zwei Zeichen lang und vier bytes lange. Was soll ' s? Wie es funktioniert, aber ich kann nicht umbrochen, mein Kopf herum, warum.InformationsquelleAutor sporak
Leider kommt es auf den browser. Sehen diese Thema der Diskussion dieses Problems. Um Ihr problem zu lösen, betrachten diese Website mit Beispielen von unterschiedlichen Header und deren Verhalten in verschiedenen Browsern.
InformationsquelleAutor ilalex
Basiert auf den großen Antworten, die hier gegeben habe, entwickelte ich eine erweiterte version, die ich habe in der Produktion schon. Basierend auf RFC 5987 und diese test-suite.
InformationsquelleAutor Michael-O
Ich habe vor kurzem dieses Problem gelöst in meiner Anwendung.
hier ist die Lösung für firefox-nur, ist es leider fehl am IE.
Antwort.addHeader("Content-Disposition", "attachment; filename*='UTF-8'" + URLEncoder.encode("árvíztűrőtükörfúrógép", "UTF-8") + ".xls");
Könnte mir jemand sagen, was ist das Ergebnis, wenn ich mit safari 5.1.7. Ich habe die gleichen Probleme. der obige code funktioniert auch im firefox, chrome und IE, aber es funktioniert nicht auf safari.
InformationsquelleAutor fallen
InformationsquelleAutor reznic
Summieren alle, die ich bisher gelesen dies funktioniert für mich:
InformationsquelleAutor Valerii Starovoitov