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

标签 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);

Excel 2007 打开如上下载的文件时,提示“文件格式与扩展名不匹配”警告。单击警告后,Excel 会显示文件的原始 xml 内容。

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

Response.AddHeader("content-disposition", "attachment;filename=FileName.xlsx");

Excel 2007 给出“Excel 在文件中发现不可读的内容”错误,随后出现一个对话框,提供在 Web 上查找转换器的功能。如果我在此对话框中单击“否”,Excel 能够加载数据。

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

在这种情况下,文件扩展名和 MIME 类型的正确组合是什么?除了不正确的 MIME 类型或扩展之外,还有什么可能导致此失败?

仅供引用,这是通过 Visual Studio 的内置开发 Web 服务器发生的。我还没有用 IIS 尝试过这个。

最佳答案

我不能肯定地说您的方法有什么问题,但我只是分享一些通过类似操作得出的观察结果。

header 是 Pascal 大小写,大多数浏览器不关心,但我会将您的内容处置更改为 Content-Disposition。更改字符集应该不是必需的或相关的。您的内容类型应该没问题,如果这实际上是文件的内容,我只会使用 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);

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

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

关于c# - 使用 Response.TransmitFile() 下载 .xlsx 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2274780/

相关文章:

c# - 如何识别 C# 中的内存泄漏?

c# - 未使用 Swagger Azure AD OAuth2 token

javascript - 限制 Enter 键按下

javascript - 带有 application/xml+xhtml 内容类型的 Dojo

c# - 在不修改属性的情况下复制文件夹/文件?

c# - 如何 : download a file keeping the original name in C#?

javascript - 必填字段验证器不适用于 JQuery 选择的下拉列表

javascript - 使用javascript从另一个弹出窗口打开一个新的弹出窗口

php - 使用 PHP GD 库调整大小和保存图像是 hell

python - uwsgi X-Sendfile 模拟 mimetype 丢失?