【问题标题】:File download in Asp.Net MVC 2Asp.Net MVC 2 中的文件下载
【发布时间】:2011-04-05 13:27:01
【问题描述】:

我想在我的 MVC 应用程序中启用文件下载,而不是简单地使用超链接。我打算使用图像等,并通过使用 jQuery 使其可点击。目前我有一个简单的只是用于测试。

我找到了通过动作方法进行下载的解释,但不幸的是该示例仍然有动作链接。

现在,我可以很好地调用下载操作方法,但没有任何反应。我想我必须对返回值做一些事情,但我不知道是什么或如何。

下面是动作方法:

    public ActionResult Download(string fileName)
    {
        string fullName = Path.Combine(GetBaseDir(), fileName);
        if (!System.IO.File.Exists(fullName))
        {
            throw new ArgumentException("Invalid file name or file does not exist!");
        }

        return new BinaryContentResult
        {
            FileName = fileName,
            ContentType = "application/octet-stream",
            Content = System.IO.File.ReadAllBytes(fullName)
        };
    }

这是 BinaryContentResult 类:

public class BinaryContentResult : ActionResult
{
    public BinaryContentResult()
    { }

    public string ContentType { get; set; }
    public string FileName { get; set; }
    public byte[] Content { get; set; }

    public override void ExecuteResult(ControllerContext context)
    {

        context.HttpContext.Response.ClearContent();
        context.HttpContext.Response.ContentType = ContentType;

        context.HttpContext.Response.AddHeader("content-disposition",

                                               "attachment; filename=" + FileName);

        context.HttpContext.Response.BinaryWrite(Content);
        context.HttpContext.Response.End();
    }
}

我通过以下方式调用操作方法:

<span id="downloadLink">Download</span>

可通过以下方式点击:

$("#downloadLink").click(function () {
    file = $(".jstree-clicked").attr("rel") + "\\" + $('.selectedRow .file').html();
    alert(file);
    $.get('/Customers/Download/', { fileName: file }, function (data) {
        //Do I need to do something here? Or where?
    });
});

请注意,操作方法和所有内容都正确接收了fileName参数,只是什么也没发生,所以我想我需要以某种方式处理返回值?

【问题讨论】:

  • 您的 BinaryContentResult 类不应该存在。使用FileResult
  • 好的,这是标准课程还是什么?它将如何帮助我解决问题?

标签: jquery asp.net-mvc-2 download


【解决方案1】:

您不想使用 AJAX 下载文件,而是希望浏览器下载它。 $.get() 将获取它,但出于安全原因需要涉及浏览器,因此无法从 Javascript 本地保存。只需重定向到下载位置,浏览器就会为您处理。

【讨论】:

  • 好的,你能具体说明我应该做什么吗?我的意思是,我可以使用简单的链接来做到这一点,就像我从中得到这个的例子一样,页面不会重新加载,而只是打开一个另存为对话框。我想要相同的行为,但是通过单击跨度来代替(确定选择类要下载哪​​个文件)。你能用一些代码指定吗?谢谢!
  • 使用document.location.href = ... 告诉浏览器去下载文件的url。它会看到内容处置标题并将其显示为下载而不是页面。
  • 完美!在我关闭这个问题之前还有一个问题:当另存为对话框出现时,它的文件名与路径和文件名中的下划线连接在一起,如下所示:folder_folder_file.txt。怎么会?我的意思是,下载工作和所有,但我希望它有它的原始文件名。 (逐步执行操作方法和 BinaryContentResult,FileName 变量有一个常规路径:文件夹\\文件夹\\文件.txt。我无法弄清楚这种下划线连接发生在哪里。有什么想法吗?
  • 您在内容配置中传递的文件名应该只是一个没有路径的文件名。出于安全原因,您无法指定文件在用户硬盘上的位置。
  • 对,我错误地传递了错误的变量(当我在半夜这样做时,我有点累:-)。感谢您的帮助!
猜你喜欢
  • 2012-01-25
  • 1970-01-01
  • 2014-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多