C#:Chrome – 用户下载一个Excel文件

我有以下代码来提示用户的浏览器下载一个Excel文件。 这是ASP.NET Web表单中的C#代码

byte[] fileData = GetExcelFile(..); Response.Clear(); Response.ContentType = "application/vnd.ms-excel"; Response.AppendHeader("Content-Disposition", "attachment; filename=report.xlsx"); Response.OutputStream.Write(fileData, 0, fileData.Length); Response.OutputStream.Flush(); Response.OutputStream.Close(); Response.Flush(); Response.Close(); Response.End(); 

当用户点击网站上的button时,将触发此代码。

它在IE11中完美运行; 用户得到一个对话框询问他们是否要保存或打开文件。 该文件打开罚款。

但是,在Chrome 56.0.2924.87(最新版本)上,用户得到一个'失败 – networking'和'加载响应数据失败'错误,没有任何东西被下载到他们的电脑上。 这部分代码在一年之内没有改变,并且已经工作了一年。 不过,我昨天testing了一下,停止了工作。

这是将Excel文件作为响应发送给用户的推荐方式

而不是刷新和closures输出数据,只需要用Response.BinaryWrite写入数据。

同时确保您使用正确的内容types。 xlsx文件是压缩的XML。 xlsx文件的正确内容types是application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

例如,假设使用EPPlus来创buildExcel文件:

  private void DumpExcel(DataTable tbl) { using (ExcelPackage pck = new ExcelPackage()) { //Create the worksheet ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Demo"); //Load the datatable into the sheet, starting from cell A1. Print the column names on row 1 ws.Cells["A1"].LoadFromDataTable(tbl, true); byte[] fileData =pck.GetAsByteArray(); //Write it back to the client Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; Response.AddHeader("content-disposition", "attachment; filename=ExcelDemo.xlsx"); Response.BinaryWrite(pck.GetAsByteArray()); } } 

你可能需要调用Response.End(); 以防止服务器发送相同的响应您的网页的其余部分。

另一种select是使用ExcelPackage.SaveAs(Stream)将文件直接写入输出stream。 这消除了临时缓冲区:

  pck.SaveAs(Response.OutputStream);