MVC3 下载单个文件

4
我有一个基于MVC3 C#.Net的Web应用程序。我们有一个"附件"功能。用户上传他们想要“附加”到提案的文档。这个文档存储在我们的服务器上等待下载。这部分已经运作正常。
然后,用户点击以表格中超链接形式显示的“附件”名称。我相信有一种通用的方法来实现此操作,只是我不知道如何做。如何使用超链接下载文件?

你能告诉我们文件结构是什么样子的吗(文件存储在哪里)?此外,您是否将文件名或其他内容存储在数据库中? - CrowderSoup
@Crowder....文件名存储在数据库中,文件路径是web.config中的设置。我们将文件名附加到路径上,从而获得完全限定的文档路径。 - MikeTWebb
1个回答

9

使用超链接下载文件时,首先需要将文件名作为路由值传递给操作链接:

@Html.ActionLink("Download", "Download", 
                 new { fileName = Model.AttachmentFileName })

您的操作将会接收fileName, 并在/some/path下打开它以供读取,然后使用ASP.NET MVC内置的FileStreamResult返回它:
public ActionResult Download(string fileName)
{
    try
    {
        var fs = System.IO.File.OpenRead(Server.MapPath("/some/path/" + fileName));
        return File(fs, "application/zip", fileName);
    }
    catch
    {
        throw new HttpException(404, "Couldn't find " + fileName);
    }
}
application/zip参数是你返回的MIME类型。在这种情况下,它是一个.zip文件。

这里是可能的MIME类型列表。


@Lester,看起来很不错...我会试一下的。谢谢! - MikeTWebb
@Lester...在寻找File.OpenRead的参考时,对象浏览器建议使用System.IO.File。然而,在我的VS2010中,System.IO并不包含File类。有什么想法吗? - MikeTWebb
抱歉,我已经更新了代码。它应该是System.IO.File.OpenRead(),并且是.NET 4的一部分。 - Lester
这段代码无法编译,因为System.IO.Server.MapPath中说System.IO中没有服务器。 - Goldentp
@Goldentp 感谢你发现了这个问题。实际上,它是基础控制器类的一部分。 - Lester
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接