如何从服务器下载文件到客户端?

7

我有一个MVC项目,希望用户可以通过点击按钮下载Excel文件。我已经获取到文件路径,但是在谷歌上找不到合适的答案。

我想在我的cshtml页面上添加一个简单的按钮来实现这个功能:

<button>Button 1</button>

我该怎么做?非常感谢您的帮助!

2个回答

18

如果文件不在您的应用程序文件夹中,并且无法直接从客户端访问,则可以创建一个控制器操作,将文件内容流式传输到客户端。这可以通过从控制器操作返回FileResult对象并使用File方法来实现:

public ActionResult Download()
{
    string file = @"c:\someFolder\foo.xlsx";
    string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    return File(file, contentType, Path.GetFileName(file));
}

然后用指向此控制器操作的锚点替换您的按钮:

@Html.ActionLink("Button 1", "Download", "SomeController")

除了使用锚标签,您也可以使用HTML表单:

@using (Html.BeginForm("Download", "SomeController", FormMethod.Post))
{
    <button type="submit">Button 1</button>
}
如果文件位于应用程序的某些对客户端不可访问的文件夹中,例如 App_Data,您可以使用 MapPath 方法,使用相对路径构造此文件的完整物理路径。
string file = HostingEnvironment.MapPath("~/App_Data/foo.xlsx");

如果文件在不同的服务器上怎么办?比如服务器名称是“VUP-1”? 假设路径为“c:\someFolder\foo.xlsx” --> 在服务器VUP-1上。 - Raspi Surya

2

HTML:

<div>@Html.ActionLink("UI Text", "function_name", "Contoller_name", new { parameterName = parameter_value },null) </div>

控制器:

public FileResult download(string filename) {
        string path = "";
        var content_type = "";
        path = Path.Combine("D:\file1", filename);

        if (filename.Contains(".pdf"))
        {
            content_type = "application/pdf";
        }
        return File(path, content_type, filename);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接