使用Response.TransmitFile()下载.xlsx文件

Odr*_*ade 15 c# asp.net mime-types

我正在研究一些生成Excel电子表格服务器端的代码,然后将其下载到用户.我正在使用ExcelPackage生成文件.

这一代工作得很好.我可以使用Excel 2007打开生成的文件,没有任何问题.但是,我无法下载文件Response.TransmitFile().

现在,我有以下代码:

//Generate the file using ExcelPackage
string fileName = generateExcelFile(dataList, "MyReportData");

Response.AddHeader("content-disposition", "attachment;filename=FileName.xls");
Response.ContentType = "application/vnd.xls"
Response.Charset = "";
Response.TransmitFile(fileName);
Run Code Online (Sandbox Code Playgroud)

当Excel 2007打开如上所下载的文件时,它会提供"文件格式与扩展名不匹配"警告.单击警告后,Excel将显示该文件的原始xml内容.

如果我更改文件扩展名,就像这样

Response.AddHeader("content-disposition", "attachment;filename=FileName.xlsx");
Run Code Online (Sandbox Code Playgroud)

Excel 2007提供"Excel在文件中找到不可读的内容"错误,然后是一个对话框,提供在Web上查找转换器.如果我点击"否",该对话框上的Excel 能够加载数据.

我还尝试了不同的MIME类型,例如application/vnd.ms-excelapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet.xls和.xlsx的文件扩展名.所有组合都导致上述两种行为之一.

在此方案中使用的文件扩展名和MIME类型的正确组合是什么?除了不正确的MIME类型或扩展名之外,还有什么可能导致此失败?

仅供参考,这是Visual Studio的内置开发Web服务器.我还没有尝试使用IIS.

Bra*_*olz 16

我不能肯定地说你的方法有什么问题,但我会从做类似的事情中分享一些观察结果.

标题是Pascal Case,大多数浏览器都不应该关心,但我会将您的内容更改为Content-Disposition.更改Charset不应该是必要的或相关的.你的内容类型应该没问题,我只会使用application/vnd.openxmlformats-officedocument.spreadsheetml.sheet和.xlsx,如果这实际上是文件的内容,否则坚持使用application/vnd.ms-excel和.xls.

您应该考虑的另一件事是向浏览器发送Content-Length:

Response.AddHeader("Content-Length", new System.IO.FileInfo("FileName.xlsx").Length);
Run Code Online (Sandbox Code Playgroud)

您是否尝试过多个浏览器?只是想知道这是否是供应商特定的问题.

作为最后的努力,您可以将Content-Type设置为application/octet-stream,并且任何浏览器都应该提供下载它,然后大多数浏览器将允许您在根据扩展名下载后打开它.

  • 设置Content-Length标头就可以了.或者,在TransmitFile()之后调用Response.End()也可以.所以,我猜浏览器不知道响应的结束在哪里? (2认同)