4 Stimmen

Benutzerdefinierter Handler mag keine Leerzeichen in Firefox

Ich habe einen benutzerdefinierten Handler implementieren IHttpHandler. Die benutzerdefinierte Handler ermöglicht es uns, eine dynamische URL für Menschen zum Herunterladen von Dateien zu produzieren.

Der Code sieht wie folgt aus,

public void ProcessRequest(HttpContext context)
{
    context.Response.AddHeader("Content-Disposition", "attachment;filename=" + attachment.FileName);
    context.Response.AddHeader("Content-Length", attachment.Fileblob.Length.ToString());
    context.Response.ContentType = GetMimeType(attachment.FileName);
    context.Response.OutputStream.Write(attachment.Fileblob, 0, attachment.Fileblob.Length);
}

Das Problem liegt bei attachment.Filename. Wenn der Dateiname zufällig ein Leerzeichen wie dieses enthält,

Dateiname - 1.bmp

Mit dem Internet Explorer funktioniert es einwandfrei, aber mit Firefox wird die Datei im Download-Dialog so abgeschnitten,

Dateiname

Keine Verlängerung oder ähnliches. Ich habe auch dies versucht,

attachment.FileName.Replace(" ", "%20")

Das funktioniert im IE wieder, aber im Firefox führt es dazu, dass der Dateiname im Download-Dialog auf diesen Wert gesetzt wird,

Dateiname%20-%201.bmp

Ich habe auch dies ausprobiert,

HttpUtility.UrlEncode(attachment.FileName)

Sowohl im Firefox als auch im IE führt das zu diesem Ergebnis,

Dateiname+-+1.bmp

Irgendwelche Ideen?

6voto

Phil.Wheeler Punkte 16548

Versuchen Sie, die tatsächlichen Leerzeichen durch %20 stattdessen. Das sollte immer noch in allen Browsern funktionieren.

bearbeiten

Ok, das scheint also nicht geholfen zu haben. Dann eben Plan B.

Versuchen wir es mit einer Änderung unserer Content-Disposition HTTP-Header, so dass der Dateiname des Anhangs in doppelte Anführungszeichen eingeschlossen wird, per RFC 2231 .

public void ProcessRequest(HttpContext context)
{
    context.Response.AddHeader("Content-Disposition", String.Format("attachment;filename=\"{0}\"", attachment.FileName));
    context.Response.AddHeader("Content-Length", attachment.Fileblob.Length.ToString());
    context.Response.ContentType = GetMimeType(attachment.FileName);
    context.Response.OutputStream.Write(attachment.Fileblob, 0, attachment.Fileblob.Length);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X