将Excel文件发送给使用Chrome和IE但不支持firefox的用户(获取没有扩展名的文件)

时间:2013-05-05 09:42:49

标签: excel firefox openxml httpresponse response.write

我使用OpenXML库生成并使用excel文件并将其发送给用户。 它适用于Chrome和IE,但是当我尝试使用Firefox时,我遇到了一个问题。

使用FF保存文件时,我得到一个没有扩展名的文件 使用FF打开文件时,它就像一个魅力:(

我正在使用以下函数将流发送给用户。

public static void SendToClient(Byte[] stream, string fileName)
{
    HttpContext.Current.Response.ClearContent();
    HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
    HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

    HttpContext.Current.Response.BinaryWrite(stream);
    HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + fileName + ".xlsx");
    HttpContext.Current.Response.AddHeader("content-length", stream.LongLength.ToString());
    HttpContext.Current.Response.End();
}

并将其称为:

_ExcelReports.SendToClient(excelUtil.ExportToExcel(excelWorkBook), projectName + " Resources");

甚至更奇怪,FF下载对话框识别文件,如截图:

FF download dialog

现在完成下载:

FF completed downloads

2 个答案:

答案 0 :(得分:2)

您是否尝试过使用contentType = "application/vnd.ms-excel"

我是一个有更大问题的新手,弄清楚我正在尝试做什么,但我工作的一点点就是使用那种内容类型。

答案 1 :(得分:1)

该代码示例适合我。所以现在是一些随机调试建议的时候了。

1)尝试清除Firefox的历史记录/ cookie /内容缓存。然后再次运行它。缓存可能会影响响应。

2)SendToClient()函数是最后一个要运行的函数吗?因为如果之后还有其他事情(因为它包含Response.End()函数),可能会发生一些奇怪的事情或破坏响应流。

3)尝试注释代码行以设置ContentEncoding,以及用于添加内容长度的代码行。事实上,尝试使用SendToClient()(对我来说最简单的):

HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

HttpContext.Current.Response.BinaryWrite(stream);
HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + fileName + ".xlsx");
HttpContext.Current.Response.End();

基本上,它是测试仍然适用于IE和Chrome的最小代码行但是FF失败。

4)尝试“内联”而不是content-disposition的“附件”,看看它是否有效。

当然,我假设OpenXML文件本身是有效的。当您打开下载的文件时(无论是使用IE还是Chrome),Excel是否会抱怨(比如要求修复文件或其他内容)?