【问题标题】:Why can't Word directly open my generated docx, but can open it when saved to disk first?为什么Word不能直接打开我生成的docx,但是先保存到磁盘可以打开?
【发布时间】:2011-10-19 15:31:26
【问题描述】:

我正在生成一个 *.docx 文件服务器端,我想在按下按钮时返回给用户。在按钮的事件处理程序中,我目前将文档数据生成为byte[](在以下代码示例中称为bytes),并将其返回给用户,如下所示:

Response.Clear();
Response.ClearHeaders();
Response.ClearContent();
Response.AddHeader("Content-Disposition", "attachment; filename=Test.docx;");
Response.AddHeader("Content-Length", bytes.Length.ToString(CultureInfo.InvariantCulture));
Response.ContentType = "application/vnd.ms-word.document.12";
Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.BinaryWrite(bytes);
Response.Flush();
Response.Close();

这会导致 IE 出现奇怪的行为,即当用户在下载时单击“打开”按钮时,word 2010 会启动并指出“Word 在尝试打开文件时遇到错误”。但是,如果用户选择先将文件保存在某处,word 会很好地打开保存的文档。

我尝试了不同的内容类型、缓存和编码选项,但无济于事。任何线索可能导致这种行为?

【问题讨论】:

    标签: c# asp.net download


    【解决方案1】:

    IE 在文件下载方面非常愚蠢。一切都通过浏览器的缓存进行调解。当启动外部程序加载文件时,IE 很可能会在 word 设法启动并尝试访问文件之前从缓存中删除文件。

    您正在输出无缓存标头,这肯定会告诉 word 不缓存文件。这有效地使文件不可下载:IE 将下载然后立即删除文件,因为它不应该被缓存。

    【讨论】:

    • 删除缓存头没有帮助。还有其他建议吗?
    【解决方案2】:

    在最后一行添加Response.End();

    【讨论】:

      【解决方案3】:

      原来这是 Office 2010 的信任设置的问题。禁用一些信任检查解决了问题:

      http://answers.microsoft.com/en-us/office/forum/office_2010-word/word-experienced-an-error-trying-to-open-the-file/07b539fa-c641-e011-9767-d8d385dcbb12

      据我所知,没有办法在服务器端解决这个问题。

      【讨论】:

        猜你喜欢
        • 2011-12-07
        • 2012-04-05
        • 2022-01-17
        • 1970-01-01
        • 1970-01-01
        • 2014-04-25
        • 2014-02-18
        • 1970-01-01
        • 2021-02-05
        相关资源
        最近更新 更多