如何使用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));
}

如何下载特定文件?

如何使用MVC4/Razor下载文件

可能的解决方案-提供表单方法和控制器名称:

@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);

并确保这条路径确实存在。