So vermeiden Sie duplicate content-disposition-Header mit MVC3 FileContentResult?

Wir haben einige Dateien in sql-Datenbank. Auf eine ASP.NET MVC3-form, wir-display 2 links:

Diese Datei anzeigen | Herunterladen diese Datei

Diese links gehen auf die entsprechenden action-Methoden. Der download funktioniert wie erwartet-auf einen link klicken und erzwingt ein speichern-dialog im browser. Aber das display verursacht duplicate Content-Disposition-Header an den browser gesendet werden, wodurch ein Fehler in Chrome, und eine leere-Seite in Firefox.

[ActionName("display-file")]
public virtual ActionResult DisplayFile (Guid fileId, string fileName)
{
    var file = _repos.GetFileInfo(fileId);
    if (file != null)
    {
        Response.AddHeader("Content-Disposition", 
            string.Format("inline; filename={0}", file.Name));
        return File(file.Content, file.MimeType, file.Name);
    }
}

[ActionName("download-file")]
public virtual ActionResult DownloadFile (Guid fileId, string fileName)
{
    var file = _repos.GetFileInfo(fileId);
    if (file != null)
    {
        return File(file.Content, file.MimeType, file.Name);
    }
}

Hier sind die 2 Header an den browser gesendet, die für die display-Aktion:

Content-Disposition: inline; filename=name-of-my-file.pdf
Content-Disposition: attachment; filename="name-of-my-file.pdf"

Ich versucht, meine benutzerdefinierte content-disposition-header, um wickeln Sie die Dateinamen in doppelte Anführungszeichen, aber es immer noch geschickt 2 Header an den browser. Ich habe auch versucht, das entfernen der Content-Disposition-header, bevor Sie die benutzerdefinierte, aber es scheint, die attachment " - header wird Hinzugefügt, nachdem die FileContentResult zurückgegeben.

Dieser code verwendet, um zu arbeiten. Ich lief ein test nur gestern und bemerkt es nicht mehr funktioniert in Chrome oder Firefox. Dies kann aufgrund von Aktualisierungen im Browser. IE8 und Safari noch geöffnet ist die Datei korrekt.

Update

Dank wieder Darin, Sie sind richtig. Wir haben tatsächlich verwendet diese Methode, da Sie eine weitere Frage, die Sie beantwortet.

Etwas mehr Infos darüber, wie dies wurde schließlich gelöst, auf unserer Seite, wir haben eine route für die Datei anzeigen link:

context.MapRoute(null,
    "path/to/display-file-attachment/{fileId}/{fileName}",
    new
    {
        area = "AreaName",
        controller = "ControllerName",
        action = "DisplayFile",
    }
);

Den hyperlink auf der Seite übergibt den Namen der Datei, um die action-Methode über die parameter der route, also ist es schon Teil der URL. Also, wir müssen nicht hinzufügen, um eine benutzerdefinierte content-disposition-header, um den Namen der Datei, die passend zum system ist, wenn ein Benutzer entschieden, um es zu laden (durch klicken auf speichern-Symbol in der browser-PDF-viewer). So benutzten wir nur dies:

[ActionName("display-file")]
public virtual ActionResult DisplayFile (Guid fileId, string fileName)
{
    var file = _repos.GetFileInfo(fileId);
    if (file != null)
    {
        //no custom content-disposition header, and no 3rd fileName argument
        return File(file.Content, file.MimeType);
    }
}
  • Firefox und Chrome haben in der Tat strenger geworden in Ihrem Umgang mit Content-Disposition-Header.
  • würdest du bitte erläutern Sie auf nicht-ASCII-Zeichen? Wir haben nicht getestet, aber mit unicode-Zeichen in Datei-Namen.
  • für nicht-ASCII-Zeichen in Dateinamen in " C-D "funktioniert" in allen Browsern, Servern derzeit tun müssen User-Agent-sniffing. Siehe greenbytes.de/tech/tc2231 und greenbytes.de/tech/webdav/rfc6266.html. Ich habe meine Zweifel, dass ASP.net wird dieses Recht, aber ich würde gerne herausfinden, sonst.
InformationsquelleAutor danludwig | 2011-12-23
Schreibe einen Kommentar