我正在开发一个包含保存上传文件功能的网络应用。文件存储在SQL数据库的“image”列中,并使用Response.BinaryWrite()通过GetFile.aspx页面提供。
直到昨天我才遇到下载Office 2007/2010文件的问题。该文件将下载没有问题,但当Word(或Excel,或任何Office程序)打开它时,它会抱怨一个损坏的文件。但它仍然会打开,没有任何立即明显的问题或缺少数据。解决方案原来是在响应中包含Content-Length标头:
If dr.Read() Then
Response.Clear()
Response.Buffer = True
Response.AppendHeader("Content-disposition", "attachment;filename=" + Server.UrlEncode(dr("FileName").ToString()))
Response.AppendHeader("Content-Length", dr("ContentSize").ToString())
Response.ContentType = dr("ContentType").ToString()
Response.BinaryWrite(dr("FileContent"))
End If
dr.Close()
Response.Flush()
Response.End()
dr
是一个SqlDataReader。
这在我的本地开发机器(Windows 7,IIS 7.5,ASP 2.0)上运行良好。下载并打开文件没有问题。但是在我们的测试服务器(Windows Server 2003,IIS 6)上,它仍然是一个问题。我使用WireShark查看了流量,发现我的Content-Length标头不存在!我正在设置的所有其他内容(包括测试标题:Response.AppendHeader("TestHeader", "TestValue")
显示。我确保ContentSize在我获得的数据中有一个值,我甚至尝试将其更改为Response.AppendHeader("Content-Length", "1234567")
以获得那里有一个值。没有任何东西出现!
我也试过Fiddler看流量;我的开发机器确实包含了内容长度属性(虽然它明显偏离一个字节...... Fiddler报告了一个协议违规),而测试服务器却没有!
发生了什么事? IIS 6是否因某种原因忽略了标题?我需要更改设置吗?