用window.open下载的Word文档无法打开(IE7 / IE8)

时间:2010-07-08 20:41:20

标签: javascript ssl ms-word

我们在使用window.open调用在IE7 / IE8中下载Word文档时遇到问题。此问题目前仅在启用了SSL的生产环境中发生 - 我们的测试环境正常运行但未启用SSL。这两个环境都运行IIS6并使用集成身份验证。

javascript非常简单:

    function OpenNewWindow(sURL, sName, sHeight, sWidth)
{
    var sFeatures = "top=40,left=190,toolbar=no,location=no,directories=no,menubar=no,scrollbars=yes,resizable=yes,status=no";
    sFeatures = "width=" + sWidth + ",height=" + sHeight + "," + sFeatures;

    var newWindow = window.open(sURL, sName, sFeatures);
    newWindow.focus();
}

以上函数正在传递相对路径,而页面本身(ASP.NET页面)是预先格式化的HTML。该页面的代码隐藏是将内容类型设置为“application / msword”,并允许ASP.NET将页面内容写入输出流。

调用上述功能时,会创建一个新窗口,然后立即关闭,不会出现任何错误或提示。据我所知(使用Fiddler),启用了缓存并且未启用HTTP压缩。返回实际的文档内容,但IE和Word之间似乎存在某种脱节。

我注意到的一个奇怪的是,在测试中出现了一个协商挑战,并在生产过程中使用Kerberos票据进行响应,没有发生挑战/响应(尽管在开始页面上确实发生了一个并且响应是NTLM) 。另外,有问题的页面(Word文档)的直接链接在两种环境中都能正常工作。最后,取消选中.DOC文件类型的“下载后确认打开”选项可以成功打开文档(但这不是我们愿意为2000多名员工提供的解决方案)。

我知道这是有限的信息,我可能需要添加更多详细信息,但我花了大量时间进行搜索/测试,并且感觉不太接近解决此问题。任何帮助将不胜感激!

两种环境的标题:

TEST请求(正常运行,无SSL)
GET /webapps/gfcse/CSEPrint.aspx?mode=ReadOnly&sSurveyId=3060 HTTP / 1.1
接受: /
接受语言:en-us
UA-CPU:x86
Accept-Encoding:gzip,deflate
User-Agent:Mozilla / 4.0(兼容; MSIE 7.0; Windows NT 5.1; InfoPath.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; OfficeLiveConnector .1.3; OfficeLivePatch.0.0)
主持人:pc55516svma
连接:保持活力
Cookie:ASP.NET_SessionId = elto5pakakvepbju42w24eef
授权:协商[snip]

测试回复
HTTP / 1.1 200 OK
缓存控制:私人
内容长度:26458
Content-Type:application / msword;字符集= UTF-8
服务器:Microsoft-IIS / 6.0
X-Powered-By:ASP.NET
MicrosoftSharePointTeamServices:12.0.0.6421
WWW-Authenticate:谈判[snip]
X-AspNet-Version:2.0.50727
日期:星期四,2010年7月8日15:14:26 GMT

[文件内容]

PRODUCTION请求(不起作用,启用SSL)
GET /gfcse/CSEPrint.aspx?mode=ReadOnly&sSurveyId=3582 HTTP / 1.1
接受: /
接受语言:en-us
UA-CPU:x86
Accept-Encoding:gzip,deflate
User-Agent:Mozilla / 4.0(兼容; MSIE 7.0; Windows NT 5.1; InfoPath.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; OfficeLiveConnector .1.3; OfficeLivePatch.0.0)
主持人:intranet.gfnet.com
连接:保持活力
Cookie:ASP.NET_SessionId = h2xw0ebweb4e2455iab1tvbf

生产响应
HTTP / 1.1 200 OK
缓存控制:私人
内容长度:26438
Content-Type:application / msword;字符集= UTF-8
服务器:Microsoft-IIS / 6.0
MicrosoftSharePointTeamServices:12.0.0.6219
X-Powered-By:ASP.NET
X-AspNet-Version:2.0.50727
日期:星期四,2010年7月8日15:07:41 GMT

[文件内容]

3 个答案:

答案 0 :(得分:4)

事实证明,问题与标题无关,而是我们通过javascript尝试做的事情 - 自动下载文件。

由于我们的测试和生产环境位于不同的安全区域,因此存在影响文件下载的不同设置(特别是“自动提示文件下载”)。由于我们尝试通过javascript在启用了信息栏的区域中下载文件,因此浏览器正在按照预期执行操作。有几种不同的方法可以解决这个问题(即组策略,下载

此线程解决了类似的问题:IE7 issue - cannot download streamed file when Automatic prompting for file downloads is disabled

答案 1 :(得分:0)

我想你会发现这不是一个与javascript有关的问题,更多是IE和HTTP头问题。我们有一个类似的问题试图打开csv文件不同的标题组合将正常工作其他人不会。我不能记住需要哪些,这些是我们最终必须设置

请注意这是在php中,但您应该能够翻译为.net

setHeader("Expires", gmdate("D, d M Y H:i:s") . " GMT")
setHeader("Last-Modified",  gmdate("D, d M Y H:i:s") . " GMT")
setHeader("Cache-Control", "", true)
setHeader('Content-Disposition', 'attachment; filename=' . $filenameToReturn)
setHeader('Content-type', 'application/octet-stream')
setHeader("Content-length", sprintf('%d', filesize($this->view->filename)));

现在我认为问题在于Cache-Control标头,它必须是空的

答案 2 :(得分:0)

您可以使用System.Web.HttpResponse强制从用户的浏览器下载文件。

Protected Sub btnDownloadMe_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnDownloadMe.Click



    Dim filename As String = "demo.docx"

    'For old version of MS Word use application/msword

    Response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
    Response.AddHeader("Content-Disposition", String.Format("attachment;filename={0}", filename))
    Response.[End]()


End Sub