在ASP.NET MVC中将文件返回到View / Download

我遇到了将存储在数据库中的文件发送回ASP.NET MVC中的用户的问题。 我想要的是一个视图,列出了两个链接,一个查看文件,并让mimetype发送给浏览器决定如何处理,另一个强制下载。

如果我选择查看一个名为SomeRandomFile.bak的文件,并且浏览器没有关联的程序来打开这种类型的文件,那么我对它的下载行为没有任何问题。 但是,如果我选择查看名为SomeRandomFile.pdfSomeRandomFile.jpg的文件,我希望文件可以简单地打开。 但我也想保留一个下载链接,这样我就可以强制下载提示,而不管文件类型如何。 这有意义吗?

我已经尝试过FileStreamResult ,它适用于大多数文件,它的构造函数默认情况下不接受文件名,所以未知文件会根据url(它不知道基于内容类型给出的扩展名)指定文件名。 如果我通过指定文件名来强制文件名,我将失去浏览器直接打开文件的能力,并且会得到一个下载提示。 有人遇到过这种情况么。

这些都是我到目前为止所尝试的例子。

//Gives me a download prompt.
return File(document.Data, document.ContentType, document.Name);

//Opens if it is a known extension type, downloads otherwise (download has bogus name and missing extension)
return new FileStreamResult(new MemoryStream(document.Data), document.ContentType);

//Gives me a download prompt (lose the ability to open by default if known type)
return new FileStreamResult(new MemoryStream(document.Data), document.ContentType) {FileDownloadName = document.Name};

有什么建议么?


public ActionResult Download()
{
    var document = ...
    var cd = new System.Net.Mime.ContentDisposition
    {
        // for example foo.bak
        FileName = document.FileName, 

        // always prompt the user for downloading, set to true if you want 
        // the browser to try to show the file inline
        Inline = false, 
    };
    Response.AppendHeader("Content-Disposition", cd.ToString());
    return File(document.Data, document.ContentType);
}

注意:上面的示例代码无法正确说明文件名中的国际字符。 有关相关标准,请参阅RFC6266。 我相信最近版本的ASP.Net MVC的File()方法和ContentDispositionHeaderValue类正确地解决了这个问题。 - 奥斯卡2016-02-25


由于在“文档”变量中没有类型暗示,我无法接受所接受的答案: var document = ...所以我发布了什么对我有用,作为别人遇到问题的替代方案。

public ActionResult DownloadFile()
{
    string filename = "File.pdf";
    string filepath = AppDomain.CurrentDomain.BaseDirectory + "/Path/To/File/" + filename;
    byte[] filedata = System.IO.File.ReadAllBytes(filepath);
    string contentType = MimeMapping.GetMimeMapping(filepath);

    var cd = new System.Net.Mime.ContentDisposition
    {
        FileName = filename,
        Inline = true,
    };

    Response.AppendHeader("Content-Disposition", cd.ToString());

    return File(filedata, contentType);
}

达林季米特洛夫的回答是正确的。 只是一个补充:

Response.AppendHeader("Content-Disposition", cd.ToString()); 如果您的响应已经包含“Content-Disposition”标题,则可能会导致浏览器无法呈现文件。 在这种情况下,您可能想要使用:

Response.Headers.Add("Content-Disposition", cd.ToString());
链接地址: http://www.djcxy.com/p/20543.html

上一篇: Returning a file to View/Download in ASP.NET MVC

下一篇: How can I properly handle 404 in ASP.NET MVC?