【问题标题】:Downloading MVC FileResult doesn't work in IE or Edge browsers下载 MVC FileResult 在 IE 或 Edge 浏览器中不起作用
【发布时间】:2019-06-12 03:11:28
【问题描述】:

我正在尝试下载通过 MVC 应用程序中的网页输入的数据生成的 excel 文件。

当按下按钮时执行此 ajax 调用,并在我的控制器中调用两个方法。一个生成excel文件,另一个下载文件:

$.ajax({
            type: 'POST',
            data: myDataObject,
            url: 'MyController/GenerateExcel/',
            success: function(data) {
                if (data.id != "") {
                    $http.get('MyController/DownloadExcel?id=' + encodeURIComponent(data.id) + '&name=' + encodeURIComponent(data.name));
                    return true;
                }
            }
        });

这是我生成 excel 文件并将其保存到 TempData 的 POST 方法:

[HttpPost]
    public JsonResult GenerateExcel(Object model)
    {
        var fileName = "myexcel.xlsx";
        var fileID = Guid.NewGuid().ToString();

        var generatedReport = GenerateCustomExcel(model);
        using (MemoryStream memoryStream = new MemoryStream())
        {
            generatedReport.SaveAs(memoryStream);
            generatedReport.Dispose();
            memoryStream.Position = 0;
            TempData[fileID] = memoryStream.ToArray();
        }


        return Json(new { id = fileID, name = fileName });
    }

这是我从 TempData 下载保存的 excel 的 GET 方法:

[HttpGet]
    public FileResult DownloadExcel(string id, string name)
    {
        if (TempData[id] != null)
        {
            byte[] fileBytes = TempData[id] as byte[];
            return File(fileBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", name);
        }
        else
        {
            return null;
        }
    }

这在 Google Chrome 和 Firefox 浏览器中完美运行。但是,当使用 Internet Explorer 或 Microsoft Edge 浏览器时,文件会拒绝下载。

调试控制台不会产生任何有用的错误。我尝试将返回的文件类型更改为八位字节流并使用 window.location.href 而不是获取请求来下载文件,但似乎没有任何效果。所有的函数都被调用并且数据在它们之间正确传递,所以路由不是问题。

有谁知道如何下载返回的 FileResult?

【问题讨论】:

标签: javascript c# asp.net-mvc


【解决方案1】:

这里有一个解决方案。除了此处列出的更改之外,它使用与我的问题相同的代码。

向您的网页添加 iframe 元素:

<iframe id="iFrameFileDownload" style="display: none;"></iframe>

在 javascript 中,将 iframe 元素的 'src' 属性设置为控制器函数 url,而不是使用 $http.get() 调用:

$.ajax({
        type: 'POST',
        data: myDataObject,
        url: 'MyController/GenerateExcel/',
        success: function(data) {
            if (data.id != "") {
                $("#iFrameFileDownload").attr("src", 'MyController/DownloadExcel?id=' + encodeURIComponent(data.id) + '&name=' + encodeURIComponent(data.name));
                return true;
            }
        }
    });

我考虑的另一个解决方案是使用 window.open() 函数而不是 $http.get()。 (来源:Download a file with mvc)但是,该解决方案使用弹出窗口,并要求用户在下载文件之前在浏览器中启用弹出窗口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 2016-01-02
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 2016-09-21
    • 2018-07-05
    相关资源
    最近更新 更多