2017-02-23 81 views
0

我有下面的代码来提示用户的浏览器下载一个excel文件。这是ASP.NET web表单中的C#代码C#:Chrome - 用户下载excel文件

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(); 

当用户单击网站上的按钮时,会触发此代码。

它在IE11中完美工作;用户会得到一个对话框,询问他们是要保存还是打开文件。该文件打开正常。

但是,在Chrome 56.0.2924.87(最新版本)上,用户得到'失败 - 网络'和'加载响应数据失败'错误,并且没有任何内容被下载到他们的计算机上。这部分代码在一年内没有改变,并且已经工作了一年。但是,我昨天测试了它,并停止工作。

这是发送Excel文件到用户的响应

+0

Web窗体,MVC,API,核心? – krillgar

+1

您对'xlsx'文档使用了错误的内容类型。 –

+0

打开浏览器控制台,查看控制台和网络选项卡,它会告诉你为什么失败。 – Gusman

回答

1

代替冲洗和关闭输出数据的推荐方式,只是Response.BinaryWrite写入数据。

此外请确保您使用正确的内容类型。 xlsx文件是压缩的XML文件。 xlsx文件的正确内容类型是application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

例如,假设EPPlus用于创建Excel文件:

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();,以防止服务器发送你的页面的其余部分在相同的反应。

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

pck.SaveAs(Response.OutputStream); 
+0

感谢您的回复。你是如何验证application/vnd.openxmlformats-officedocument.spreadsheetml.sheet是否是正确的内容类型的? – user2769810

+0

此外,我试过你的解决方案,它的工作原理。但是,当文件在Excel中打开时,我会收到一个“Excel在'... xlsx'中发现无法读取的内容'”您是否想要恢复此工作簿的内容?“是否可能与解决方案有关 – user2769810

+0

这是一个很好的已知的内容类型,您使用的是旧的'xls'文件 –