如何链接到ASP.NET MVC中的可下载文件?

时间:2009-12-08 06:58:30

标签: c# .net asp.net asp.net-mvc

我是ASP.NET MVC的新手,我试图链接到可下载的文件(.zip,.mp3,.doc等)。
我有以下观点:ProductName 映射到:http://domain/ProductName
我的.zip文件必须映射到网址 http://domain/ProductName/Product.zip

问题

我在哪里将此.zip文件放在MVC文件夹结构中? 如何在MVC中添加此.zip文件的链接?是否有这样做的Url。*方法?

3 个答案:

答案 0 :(得分:18)

您可以使用FilePathResult或Controller.File方法。

protected internal virtual FilePathResult File(string fileName, string contentType, string fileDownloadName) {
  return new FilePathResult(fileName, contentType) { FileDownloadName = fileDownloadName };
}

示例代码操作方法。

public ActionResult Download(){
  return File(fileName,contentType,downloadFileName);
}

希望这段代码。

答案 1 :(得分:8)

以下类为您的程序添加文件DownloadResult

public class DownloadResult : ActionResult
{

    public DownloadResult()
    {
    }

    public DownloadResult(string virtualPath)
    {
        this.VirtualPath = virtualPath;
    }

    public string VirtualPath { get; set; }

    public string FileDownloadName { get; set; }

    public override void ExecuteResult(ControllerContext context)
    {
        if (!String.IsNullOrEmpty(FileDownloadName))
        {
            context.HttpContext.Response.AddHeader("content-disposition",
              "attachment; filename=" + this.FileDownloadName);
        }

        string filePath = context.HttpContext.Server.MapPath(this.VirtualPath);
        context.HttpContext.Response.TransmitFile(filePath);
    }
}

要调用它,请在控制器方法中执行以下操作:

public ActionResult Download(string name)
{
    return new DownloadResult 
       { VirtualPath = "~/files/" + name, FileDownloadName = name };
}

注意虚拟路径,它是站点根目录中的文件目录;这可以更改为您想要的任何文件夹。这是您放置文件以供下载的地方。 查看本教程中的Writing A Custom File Download Action Result For ASP.NET MVC

答案 2 :(得分:0)

另一个使用FileResult作为takepara的简化示例。

注意我创建了一个HelperController.cs类。

在你看来......

@Html.ActionLink("Link Description", "Download", "Helper", new { fileName = "downloaded_file_name.ext", path = "root path location to your file" }, null)


控制器动作......

public FileResult Download(string fileName, string path)
{
    var webRootPath = Server.MapPath("~");
    var documentationPath = Path.GetFullPath(Path.Combine(webRootPath, path));
    var filePath = Path.GetFullPath(Path.Combine(documentationPath, fileName));

    return File(filePath, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
}