7 Stimmen

HttpResponse: Ersetzen von Leerzeichen in Dateinamen durch Unterstriche

Beim Herunterladen einer Datei mit Response.Write werden Leerzeichen im Dateinamen durch Unterstriche ersetzt, und wenn die zugehörige Anwendung geöffnet wird, wird eine Zahl in eckigen Klammern angefügt:

Response.AppendHeader("Content-disposition", "attachment; filename=this is the file.xml");
Response.Write(dr["InfopathDoc"]);

Dies führt zu diesem Dateinamen in der zugehörigen Anwendung:

este _is _die _ datei[1].xml

Wie kann ich die Unterstriche loswerden und warum bekomme ich die [1]?

Danke

7voto

Yasir Laghari Punkte 10566

Hier finden Sie die Lösung für dieses Problem

http://dotnetslackers.com/Community/blogs/kaushalparik/archive/2009/05/06/file-download-problem-filename-with-spaces-truncated-in-ff-and-replaced-by-underscore-in-ie.aspx

Um das Problem für FF zu lösen, fügen Sie Anführungszeichen um den Dateinamen hinzu, wie

Response.AddHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");

Und für IE, ersetzen Sie Leerzeichen mit '%20'.

Dateiname = toDownload.Name.Replace(" ", "%20");

4voto

ZipwiZ Punkte 126

Falls noch jemand interessiert ist:

Diese Art des Umschreibens von Dateinamen wird nur vom Browser durchgeführt, wie Sie sehen können, wenn Sie die empfangene HTTP-Antwort mit einem geeigneten Tool untersuchen, unabhängig vom verwendeten Browser. Der IE lädt die angeforderte Datei zunächst in sein Ordnersystem "Temporary Internet Files" herunter (das nicht nur aus einem einzigen Ordner besteht, aber das ist ein anderes Thema), und zu diesem Zweck erhält die Datei einen neuen Namen, der am besten zu dem "Content-Disposition"-Vorschlag aus der HTTP-Antwort passt. Wenn aber eine gleichnamige Datei bereits in die eigentliche "Temporary Internet Files"-Ordner tatsächlich für diese Datei verwendet wird, wird sein Name um eine fortlaufende Nummer in Klammern erweitert, z. B. "[2]". Da der Cache-Mechanismus des Internet Explorers bei jeder neuen HTTP-Anforderung den tatsächlichen Cache-Ordner neu berechnet und der nächste gewählte Cache-Ordner möglicherweise noch keine Datei mit diesem Namen enthält, kann die Nummer beim nächsten Herunterladen einer Datei oder Ressource mit demselben Namen scheinbar verschwinden.

Wenn eine heruntergeladene Datei irgendwo gespeichert wird, wird normalerweise wieder der ursprünglich vorgeschlagene Dateiname verwendet, abhängig von der IE-Version. Einige Versionen und Patch-Levels scheinen stattdessen den Dateinamen des Cache-Ordners zu verwenden :-(

Das Problem fängt an, lästig zu werden, wenn der Browser eine heruntergeladene Datei an eine ausgewählte oder automatisch ausgewählte Anwendung weitergibt. I

(1) Der Dateiname ist der Name der Datei im Cache-Ordner, nicht der vorgeschlagene Name. Dabei kann sogar die Erweiterung entfernt werden, was einige Anwendungen verwirren kann, selbst wenn sie für die korrekte Handhabung der Datei ausgewählt wurden.

(2) Wenn ein Internet-Neuling eine Datei herunterlädt und öffnet, um sie zu bearbeiten, und dann einfach auf die Schaltfläche "Speichern" der Anwendung drückt, wird die Datei einfach im Cache-Ordner des IE gespeichert, und kein Benutzer dieser Art wird diese Datei jemals wieder finden. Das sind Dinge, die Menschen wirklich wütend und verzweifelt machen können...

4voto

ZipwiZ Punkte 126

Im Internet finden sich einige Lösungsvorschläge für diese Art von Problem. Nicht alle Lösungen funktionieren überall und für alle Browser, aber einige Lösungen garantieren zumindest "sichere Ergebnisse", auch wenn sie den ursprünglich "vorgeschlagenen" Dateinamen nicht für alle Clients beibehalten können:

Der erste Blick:

Inhalt-Disposition: attachment; filename=Mein neues Dokument.pdf;

FF36: Bietet die Datei "My" zum Download an :-( IE6: Zeigt "Mein neues Dokument.pdf" an, aber beim Öffnen kann es als "Mein neues Dokument[1].pdf" erscheinen. IE8: Zeigt "Mein_Neues_Dokument.pdf" an, kann aber auch "[1]" anhängen wie IE6. ACHTUNG: Beim Speichern des Dokuments behält der IE den angezeigten Namen bei, unabhängig davon, welchen Namen er beim direkten Öffnen an die ausgewählte Anwendung weitergibt!

Erste Verbesserung:

Content-Disposition: attachment; filename="Mein neues Dokument.pdf";

FF36: Funktioniert wie erwartet, d. h. zeigt "Mein neues Dokument.pdf" an. IE6+IE8: Keine Änderung, genau wie vorher.

Zweite Änderung:

Inhalt-Disposition: attachment; filename="Mein%20Neues%20Dokument.pdf";

(Leerzeichen durch %20 ersetzen, wie bei der URL-Kodierung, und doppelte Anführungszeichen beibehalten).

FF36: Zeigt, was zurückgeschickt wurde, nämlich "Mein%20Neues%20Dokument.pdf". Nicht schön. IE6+IE8: Zeigt "Mein neues Dokument.pdf" an, gibt aber "Mein%20neues%20Dokument.pdf" aus.

Dritte Variante:

Inhalt-Disposition: attachment; filename=Mein%20neues%20Dokument.pdf;

(Entfernen Sie die Anführungszeichen, aber behalten Sie %20.)

FF36: Wie oben - nicht schön. IE6+IE8: Wie oben - auch nicht so schön.

Schlussfolgerung:

Es scheint, dass zumindest die vorgestellten Methoden das Problem nicht vollständig und für immer lösen: Weder decken sie alle Situationen für einen Browser ab, noch decken sie alle Browser für ein und dieselbe ausgewählte Situation ab.

Für mich scheint das beste Ergebnis mit umgebenden doppelten Anführungszeichen möglich zu sein: Bei FF36 und IE6 funktioniert das, und bei IE8 (und wahrscheinlich auch bei IE7) ist es zumindest stabil mit den Unterstrichen, d. h. download & save geben denselben Dateinamen wieder wie download & open, außer dem "[1]", das wir sowieso nicht verhindern können.

Schlussbemerkungen

Manche halten es mit dem kleinen König aus Saint-Exupérys "Der kleine Prinz", der besagt, dass ein Kaiser nicht wirklich erwarten kann, dass sein Volk ihm folgt, wenn er etwas verlangt, was einfach nicht möglich ist, was ihn dazu veranlasst, der Sonne zu befehlen, gerade dann auf- und unterzugehen, wenn sie es auf natürliche Weise tut. So wie dieser König in Schwierigkeiten gerät, wenn sein kleiner Planet seine Rotation immer mehr beschleunigt, haben diese Leute aufgegeben und fügen schon auf der Serverseite einfach Unterstriche ein :-)

Aber die RFCs zu diesem Thema und das, was die Browser-Implementierer anbieten, sind manchmal ziemlich schwer zu überwinden.

0voto

Xn0vv3r Punkte 17236

Haben Sie versucht, Leerzeichen durch "%20" (ohne doppelte Anführungszeichen) zu ersetzen, wie in Urls?

Aber Sie sollten bedenken Leerzeichen in Dateinamen vermeiden (in Urls).

0voto

Cerebrus Punkte 25410

Sollten Sie nicht stattdessen Response.Output.Write() verwenden, nachdem Sie die Ausgabe mit HTMLEncoding codiert haben?

Response.Output.Write(Server.HtmlEncode(Convert.ToString(dr["InfopathDoc"])));

Editar: Die Unterstriche und die [1] im Dateinamen deuten darauf hin, dass die Datei aus dem Ordner für temporäre Internetdateien geladen wird. Es liegen keine ausreichenden Informationen vor, um den Grund dafür zu ermitteln, aber vielleicht geben Ihnen diese Informationen einen Anhaltspunkt.

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