我正在研究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
答案 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
)