0

我发现这个问题提出了几次,但还没有明确的答案。看起来像一个体面的解决方案会帮助不少人。

因此,我们在服务器上创建了一个 excel 文件 (.xlsx) 并使用 content-disposition 'attachment' 将其下载到客户端。如果您选择“保存”或“打开”然后“另存为”,则会出现“打开保存”对话框,并且一切正常... 但是,如果您选择“打开”然后点击“保存...”按钮,则 Excel 会挂起片刻,然后显示以下消息:您的由于共享冲突,无法将更改保存到“Export[5].xlsx”。尝试保存到其他文件。那么:您尝试打开的文件“F8CAC020.IE5\HM2NBE5C\F8CAC020”的格式与文件扩展名指定的格式不同。在打开文件之前,请确认文件没有损坏并且来自受信任的来源。您现在要打开文件吗?然后:你终于得到了另存为:对话框(假设你按下了“是”)。

创建文件的代码是:

Response.Clear()
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
Response.AppendHeader("content-disposition", "attachment;filename=Export.xlsx")
Response.AddHeader("Content-Length", New System.IO.FileInfo(NewFile).Length)
Response.TransmitFile(NewFile)
Response.Flush()

如果您删除 content-disposition 标头,您将在 Excel 中获得正确的行为,但名称错误并且不能保证 Excel 文档不会显示在浏览器中(取决于客户端设置)。如果您按打开然后保存,那么您会收到一条消息:“default.aspx”是只读的。若要保存副本,请单击“确定”,然后在“另存为”对话框中为工作簿指定一个新名称。

所以问题是如何将这两种行为组合成一个合理的行为:当您尝试打开然后保存下载的文件时,直接在上面获取漂亮的错误消息,但还要指定应该下载文档并指定默认文件名。

干杯,

詹姆士

4

1 回答 1

0

我相信 IE 文件下载代码中存在一个错误,它无法确认从 Web 服务器完成的文件传输(下载),因此在尝试保存时会打开与下载的(临时)文件的连接。这会生成“共享冲突”消息。我用 FireFox 尝试了相同的代码,但没有得到相同的结果,这肯定让我相信这是一个特定于 IE 的问题。

不幸的是,鉴于我认为这是 IE 中的一个错误,我认为目前还没有一个干净的解决方案来解决这个问题。

于 2011-11-17T15:24:44.957 回答