Vorherige Antworten sind richtig zu tun: das Hinzufügen der Zeile ...
Response.AddHeader("Content-Disposition", "inline; filename=[filename]");
... bewirkt, dass mehrere Content-Disposition-Header an den Browser gesendet werden.Dies geschieht b/c FileContentResult
wendet intern den Header an, wenn Sie es mit einem Dateinamen angeben. Eine alternative und ziemlich einfache Lösung besteht darin, einfach eine Unterklasse von FileContentResult
zu erstellen und deren ExecuteResult()
-Methode zu überschreiben. Hier ist ein Beispiel, das eine Instanz der System.Net.Mime.ContentDisposition
Klasse instanziiert (das gleiche Objekt in der internen FileContentResult
Implementierung verwendet) und leitet es in die neue Klasse:
public class FileContentResultWithContentDisposition : FileContentResult
{
private const string ContentDispositionHeaderName = "Content-Disposition";
public FileContentResultWithContentDisposition(byte[] fileContents, string contentType, ContentDisposition contentDisposition)
: base(fileContents, contentType)
{
// check for null or invalid ctor arguments
ContentDisposition = contentDisposition;
}
public ContentDisposition ContentDisposition { get; private set; }
public override void ExecuteResult(ControllerContext context)
{
// check for null or invalid method argument
ContentDisposition.FileName = ContentDisposition.FileName ?? FileDownloadName;
var response = context.HttpContext.Response;
response.ContentType = ContentType;
response.AddHeader(ContentDispositionHeaderName, ContentDisposition.ToString());
WriteFile(response);
}
}
In Ihrem Controller
oder in einer Basis Controller
, können Sie schreiben ein einfacher Helfer wie so ein FileContentResultWithContentDisposition
und dann rufen Sie es von Ihrer Aktionsmethode, instanziiert:
protected virtual FileContentResult File(byte[] fileContents, string contentType, ContentDisposition contentDisposition)
{
var result = new FileContentResultWithContentDisposition(fileContents, contentType, contentDisposition);
return result;
}
public ActionResult Report()
{
// get a reference to your document or file
// in this example the report exposes properties for
// the byte[] data and content-type of the document
var report = ...
return File(report.Data, report.ContentType, new ContentDisposition {
Inline = true,
FileName = report.FileName
});
}
Jetzt wird die Datei mit dem Dateinamen an den Browser gesendet werden, die Sie und mit einem Content-Disposition-Header " Inline; Dateiname = [Dateiname] ".
Ich hoffe, dass hilft!
public ActionResult DownloadFile() {
return File(@"c:\path\to\somefile.pdf", "application/pdf", "Your Filename.pdf");
}
Das ist einfacher als das Verfahren, vorgeschlagen von @ azarc3 da man nicht einmal das Bytes lesen benötigen:
Ein Hack, aber ein sehr effektiver Hack! Vielen Dank! –
Leider immer noch mit IE 11 benötigt. Nicht benötigt mit Chrome und Firefox. –