2010-03-30 5 views
7

Ich benutze HttpContext-Objekt in HttpHandler Kind implementiert, um eine Datei herunterzuladen, wenn ich nicht-ASCII-Zeichen in Dateiname sieht es seltsam in IE, während es in Firefox gut aussieht.Unicode in Content-Disposition header

unten ist der Code: -

 context.Response.ContentType = ".cs"; 
context.Response.AppendHeader("Content-Length", data.Length.ToString()); 
context.Response.AppendHeader("Content-Disposition", String.Format("attachment; filename={0}",filename)); 
     context.Response.OutputStream.Write(data, 0, data.Length); 

context.Response.Flush(); 

, wenn ich 'ay' 'å¤' 'ö' 'ü' 'ó' 'ay' 'å¤' 'ö' ‚liefern ü '' à 'in Dateiname Feld sieht anders aus als das, was ich habe in Dateiname sieht es gut aus in Firefox. Das Hinzufügen von EncodingType und Zeichensatz hat keinen Sinn gemacht.

In dh es ist 'ö' 'ä' 'Ãâ' 'ó' 'ü' 'ö' 'ä' 'Ãâ' ‚ü'_ 'ó' und in Firefox ist es '' '' '' '' '' '' '' '' '' '' '' '.

Irgendeine Idee, wie das behoben werden kann?

+0

Ist dies der Inhalt der Datei oder der Dateiname selbst? – leppie

+0

@leppie, es ist der Dateiname selbst – Ranjeet

Antwort

12

Ich hatte ähnliches Problem. Sie müssen HttpUtility.UrlEncode oder Server.UrlEncode verwenden, um den Dateinamen zu codieren. Auch ich erinnere mich, dass Firefox es nicht brauchte. Darüber hinaus ruiniert Dateiname, wenn es URL-codiert ist. Mein Code:

// 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); 

bearbeiten

Ich habe Spezifikation mehr sorgfältig zu lesen. Vor allem RFC2183 heißt es:

Aktuelle [RFC 2045] Grammatik Parameterwerte beschränkt (und damit Content-Disposition Dateinamen) auf US-ASCII.

Aber dann fand ich Hinweise, dass [RFC 2045] verworfene ist und man muss RFC 2231 verweisen, in dem es heißt:

Sternchen („*“) werden wieder verwendet , um die Anzeige, dass Sprache und Zeichensatzinformation ist vorhanden und Kodierung wird verwendet. Ein einzelnes Zitat ("'") wird verwendet, um den Zeichensatz und Sprachinformation am Anfang des Parameters Wert zu begrenzen. Prozentzeichen („%“) als die Kodierung Flagge verwendet, die 2047.

mit RFC stimmt was bedeutet, dass Sie UrlEncode für Nicht-ASCII-Zeichen wie gesagt verwenden können, aber man könnte auch hinzufügen Codierung Beschreibung. Hier ein Beispiel:

string.Format("attachment; filename*=UTF-8''{0}", Server.UrlEncode(fileName)); 

Hat es allerdings nicht versuchen ..

+0

@Sergej, habe ich versucht, was Sie gesagt haben, und es funktioniert gut, können Sie bitte erklären, warum es Dateinamen ruiniert, so dass ich es in meinem Kopf klar habe, bevor ich es tatsächlich implementieren. – Ranjeet

+0

Gemäß Ashs Antwort habe ich das aber mit 'UrlPathEncode' verwendet, was wie ein Zauber funktioniert (es fügt keine '+' Zeichen hinzu). – Andrew

5

HttpUtility.UrlPathEncode könnte eine bessere Option sein. Da URLEncode Leerzeichen durch '+' Zeichen ersetzen wird.

3

Für mich ist diese Lösung auf allen gängigen Browsern funktioniert:

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); 

MVC ASP.NET verwenden 3.

Das Ersetzen ist notwendig, da Chrome nicht wie Comma tut (,) im Parameter Werte: http://www.gangarasa.com/lets-Do-GoodCode/tag/err_response_headers_multiple_content_disposition/

1

Für mich dieses löste das Problem:

var result = new HttpResponseMessage(HttpStatusCode.OK) 
{ 
    Content = new ByteArrayContent(data) 
}; 

result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
{ 
    FileNameStar = "foo-ä-€.html" 
}; 

Wenn ich die repsonse in fiddler suchen Anzeige i den Dateinamen automaticcaly codiert wurde sehen können mit UTF-8:

Fiddler response example with encoded Content-Disposition filename using UTF-8

Wenn wir den Wert des Content-Disposition-Header aussehen können wir sehen, wird es sein das gleiche wie @Johannes Geyer seine Antwort. Der einzige Unterschied ist, dass wir nicht selbst codieren mussten, die ContentDispositionHeaderValue-Klasse kümmert sich darum.

Ich habe die Testfälle für die Content-Disposition Header auf: http://greenbytes.de/tech/tc2231/ wie von Julian Reschke erwähnt. Informationen zur ContentDispositionHeaderValue-Klasse finden Sie auf MSDN.