将 excel 文件从 MVC 5 控制器流式传输到浏览器

Posted

技术标签:

【中文标题】将 excel 文件从 MVC 5 控制器流式传输到浏览器【英文标题】:Streaming excel file from MVC 5 Controller to browser 【发布时间】:2015-06-08 15:15:28 【问题描述】:

我正在尝试从 MVC 5 控制器流式传输输出,但无法让浏览器(IE 10,11、Chrome)识别 输出流和管道到 Excel。我已通过将输出保存到 一个文件并打开它。我使用 Fiddler 来确定标题和数据看起来不错(见下文)。控制器是 被下面列出的 jquery ajax 调用调用。下面也列出了被调用的 Controller 方法。 ajax 返回状态返回到错误函数,req.status = 200 (OK),但 status = 'parseerror'。 任何帮助将不胜感激。

$.ajax(
    type: "POST",
    url: "http://localhost:42655/Home/Save",
    data: paramdata,
    contentType: defaultjsonformat,
    dataType: 'json',
    success: function(data) 
         alert(data);
    ,
    statusCode: 
        404: function (content)  alert('cannot find resource'); ,
        500: function (content)  alert('internal server error'); 
    ,
    error: function (req, status, errorObj) 
        if (status === "timeout") 
            alert('Timeout');
         else 
            alert(status);
        

    

);

HomeController.cs:

[AcceptVerbs(HttpVerbs.Post)]
public FileStreamResult Save(string document)

    document = document.Trim();


    byte[] bytefile = Export.Excel.ProcessExport.ExportFile(document);

    var stream = new MemoryStream(bytefile);

    return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", document + DateTime.Now.ToString("yyyy-MM-dd-hh-mm-ss") + ".xlsx");


提琴手输出:

HTTP/1.1 200 OK
Cache-Control: private
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Server: Microsoft-IIS/8.0
X-AspNetMvc-Version: 5.2
Content-Disposition: attachment; filename=test2015-04-03-06-52-04.xlsx
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?RDpcTFJQXFJvb3QtREVWXFNjZW5hcmlvXFNjZW5hcmlvXEhvbWVcU2F2ZQ==?=
X-Powered-By: ASP.NET
Date: Fri, 03 Apr 2015 13:52:04 GMT
Content-Length: 9779

PK    6 F H  

编辑:我意识到 ajax 调用正在接收所有数据,所以我现在想知道如何使用参数调用控制器。

【问题讨论】:

根据 ***.com/questions/5061310/… 你对 jquery 说你期望 JSON 类型的结果然后你返回一个文件,你应该删除行 dataType: 'json' 是的,但这不是我想要的行为。我想让 ajax 调用重定向到控制器,这反过来将生成一个文件以流式传输到浏览器。如果 ajax 调用可以使用参数调用控制器,那也是可以接受的。 如果你真的需要它成为一个 POST 我相信你可以在你的页面上创建一个表单,而不是进行 ajax 调用,你可以更改该表单上的字段并通过 JQuery 提交它,你会以这种方式从服务器获取文件。如果它可以是 GET,您只需更改窗口的位置即可下载文件。 ajax 调用嵌入在 kendo 树视图选择函数中,所以我不确定表单发布方法是否会成为可行的方法。在这一点上,可以在 select 语句中调用带有控制器参数的任何方法对我都有好处。 【参考方案1】:

我不认为您将能够通过 jQuery ajax 调用实现您正在寻找的东西。它不是为下载这样的文件而设计的。

我很幸运地使用以下插件实现了与您相同的行为(从 MVC 控制器异步返回 excel 电子表格):https://github.com/johnculviner/jquery.fileDownload。

希望有帮助:)

【讨论】:

以上是关于将 excel 文件从 MVC 5 控制器流式传输到浏览器的主要内容,如果未能解决你的问题,请参考以下文章

如何从 ASP.NET MVC 控制器操作流式传输 MP3

将控制台应用程序的标准输出流式传输到 ASP.NET MVC 视图

如何在 ASP.Net MVC 中实现视频文件流式传输?

MVC 视频流式传输到移动网络浏览器

流式传输一个巨大的 Excel 文件,动态创建它?

在 Swift 3 中从服务器流式传输 mp3 文件