在Web应用程序的服务器上提供静态文件下载

时间:2014-11-11 19:44:24

标签: asp.net-mvc-4 razor download

我正在研究MVC 4 Web应用程序。在一个页面上,我提供了一个锚链接,它指的是应用程序目录中的文件。它的代码是 -

@Html.Action("Download_Static_File", "Charge_Entry", new { File_Path = "../../Content/Templates/Pt_Data/Pt_Data.xls", File_Name = "Pt_Data_Template", value = "Download template" });

我的动机是该文件应该点击下载。

然而,当我点击链接时,我收到类似

的错误
  

无法找到路径的一部分' C:\ Program Files \ Common Files \ Microsoft Shared \ Content \ Templates \ Pt_Data \ Pt_Data.xls'。'

我也试过

System.Web.HttpContext.Current.Server.MapPath

给出了这个错误:

  

使用自定义TextWriter时,OutputStream不可用。

被调用的动作方法是:

    public FileResult Download_Static_File(string File_Path,string File_Name)
    {
        byte[] fileBytes = System.IO.File.ReadAllBytes(File_Path);
        return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, File_Name);
    }

这是正确的做法吗?任何帮助将不胜感激。

我也提到了link

1 个答案:

答案 0 :(得分:4)

您的锚点似乎指向名为Download_Static_File的控制器操作(遗憾的是您没有显示)并传递一个名为File_Path的参数。

您在视图中使用的@Html.Action帮助程序正在尝试将指定的操作作为子操作执行。您可能会发现以下博客文章对描述子操作有用:http://haacked.com/archive/2009/11/18/aspnetmvc2-render-action.aspx/

我想你想要实现的是在你的视图中生成一个锚点,指向可以由用户下载的静态文件。在这种情况下,您宁愿将锚标记与Url.Action帮助程序一起使用:

<a href="@Url.Content("~/Content/Templates/Pt_Data/Pt_Data.xls")">
    Download_Static_File
</a>

这假设您的Web应用程序在根目录下有一个名为Content/Templates/Pt_Data的文件夹,其中包含一个名为Pt_Data.xls的文件,当用户点击此锚标记时,该文件将被用户下载。

另一方面,如果用户要下载的文件位于无法从客户端公开访问的文件夹中(例如~/App_Data文件夹),则在这种情况下您可能具有服务器上的控制器操作将流式传输文件:

public ActionResult DownloadStaticFile(string filename)
{

    string path = Server.MapPath("~/App_Data");
    string file = Path.Combine(path, filename);
    file = Path.GetFullPath(file);
    if (!file.StartsWith(path))
    {
        throw new HttpException(403, "Forbidden");
    }
    return File(file, "application/pdf");
}

然后在您的视图中,您将拥有此控制器操作的锚点:

@Html.ActionLink(
    linkText: "Download template", 
    actionName: "DownloadStaticFile", 
    controllerName: "Charge_Entry", 
    routeValues: new { filename = "Pt_Data.xls" },
    htmlAttributes: null
)