如何使用MVC4/Razor下载文件
本文关键字:下载 文件 Razor 何使用 MVC4 | 更新日期: 2023-09-27 18:20:20
我有一个MVC应用程序。我想下载一份pdf。
这是我观点的一部分:
<p>
<span class="label">Information:</span>
@using (Html.BeginForm("DownloadFile")) { <input type="submit" value="Download"/> }
</p>
这是我控制器的一部分:
private string FDir_AppData = "~/App_Data/";
public ActionResult DownloadFile()
{
var sDocument = Server.MapPath(FDir_AppData + "MyFile.pdf");
if (!sDocument.StartsWith(FDir_AppData))
{
// Ensure that we are serving file only inside the App_Data folder
// and block requests outside like "../web.config"
throw new HttpException(403, "Forbidden");
}
if (!System.IO.File.Exists(sDocument))
{
return HttpNotFound();
}
return File(sDocument, "application/pdf", Server.UrlEncode(sDocument));
}
如何下载特定文件?
可能的解决方案-提供表单方法和控制器名称:
@using (Html.BeginForm("DownloadFile", "Controller", FormMethod.Get))
{ <input type="submit" value="Download" /> }
或尝试使用动作链接而不是形式:
@Html.ActionLink("Download", "DownloadFile", "Controller")
或尝试提供文件的直接url:
<a href="~/App_Data/MyFile.pdf">Download</>
由于安全原因,这不是最佳做法,但您仍然可以尝试。。。此外,您可以将文件位置包装到一些@Html
辅助方法:
public static class HtmlExtensions {
private const string FDir_AppData = "~/App_Data/";
public static MvcHtmlString File(this HtmlHelper helper, string name){
return MvcHtmlString.Create(Path.Combine(FDir_AppData, name));
}
}
在视图中:
<a href="@Html.File("MyFile.pdf")">Download</>
将DownloadFile
操作签名更改为:
public ActionResult DownloadFile()
收件人:
public FileResult DownloadFile()
此外,我认为文件路径的UrlEncode
是多余的,将其更改为:
return File(sDocument, "application/pdf", sDocument);
并确保这条路径确实存在。