<img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=982826425155997&amp;ev=PageView&amp;noscript=1">

ASP MVC download filename encoding: Dateiname mit Umlauten

Lange Zeit haben wir mit Problemen in verschiedenen Browsern beim Herunterladen von Dateien gekämpft.
Da in Deutschland viele Dateinamen Umlaute (ä, ö, ü) und scharfes S (ß) enthalten, kam es zu Verunglimpfungen des Dateinamens beim Download. Leerzeichen wurden durch Plus (+) oder %20 ersetzt.

Dateiname_mit_falschem_Encoding

Ausgangslage

Die älteren Versionen von Internet Explorer verursachten viele Probleme, aber auch Firefox und sogar der Wechsel von Windows zu Mac OS X führten zu unterschiedlichem Verhalten. Der einzige Browser, der wirklich ohne Probleme lief, war Chrome.

Im Internet gibt es eine ganze Reihe von Lösungen, die aber oftmals nicht für alle Browser funktionieren bzw. pro Browser unterscheiden:

// IE needs url encoding, FF doesn't support it, Google Chrome doesn't care
if (Request.Browser.IsBrowser ("IE"))
{
    fileName = Server.UrlEncode(fileName);
}

Response.Clear();
Response.AddHeader("content-disposition", String.Format("attachment;filename=\"{0}\"", fileName));
Response.AddHeader("Content-Length", data.Length.ToString(CultureInfo.InvariantCulture));
Response.ContentType = mimeType;
Response.BinaryWrite(data);

Quelle: Stackoverflow

Dies war recht unbefriedigend.

Lösung

Glücklicherweise haben wir eine ganz einfache Lösung gefunden:

Response.AppendHeader("Content-Disposition", string.Format("attachment; filename*=UTF-8''{0}", HttpUtility.UrlPathEncode(fileName).Replace(",", "%2C"));
var mime = MimeMapping.GetMimeMapping(fileName);
return File(fileName, mime);

Diese Lösung funktioniert in allen aktuellen Browsern und erlaubt Umlaute, Leerzeichen und Sonderzeichen im Dateinamen.

Der Trick ist, dass moderne Browser die Angabe von Unicode-Dateinamen erlauben mit folgender Konvention:
filename*=UTF-8''<Filename>

Dies wird dokumentiert in RFC2231.

Chrome kommt aber mit Kommas (,) durcheinander (duplicate header), daher das Replace(). Weitere Infos finden Sie hier: Chrome Duplicate Headers

Johannes Geyer Veröffentlicht in ASP.NET MVC 1 Comment

Einfach organisiert mit julitec

Kostenfrei starten mit julitec Free!

Sichern Sie sich unser eBook!

Download eBook mit 5 kostenfreien Software-Tools für Newsletter, CRM und Kundenservice