我希望将 SharePoint 2003 文档库中的文件流式传输到浏览器。基本上,这个想法是将文件作为流打开,然后将文件流“写入”到响应中,指定内容类型和内容处置标头。内容配置用于保存文件名,内容类型当然是为了提示浏览器打开什么应用程序来查看文件。
这在开发环境和 UAT 环境中运行良好。但是,在生产环境中,事情并不总是按预期工作,但仅限于 IE6/IE7。FF 适用于所有环境。
请注意,在生产环境中启用并通常使用 SSL。(当生产环境中不使用 SSL 时,文件流,按预期命名,并正确显示。)
这是一个代码片段:
System.IO.FileStream fs = new System.IO.FileStream(Server.MapPath(".") + "\\" + "test.doc", System.IO.FileMode.Open);
long byteNum = fs.Length;
byte[] pdfBytes = new byte[byteNum];
fs.Read(pdfBytes, 0, (int)byteNum);
Response.AppendHeader("Content-disposition", "filename=Testme.doc");
Response.CacheControl = "no-cache";
Response.ContentType = "application/msword; charset=utf-8";
Response.Expires = -1;
Response.OutputStream.Write(pdfBytes, 0, pdfBytes.Length);
Response.Flush();
Response.Close();
fs.Close();
就像我说的,这个代码片段在开发机器和 UAT 环境中运行良好。将打开一个对话框并要求保存、查看或取消 Testme.doc。但仅在生产中使用 SSL 时,IE 6 和 IE7 不使用附件名称。相反,它使用发送流的页面名称 testheader.apx,然后引发错误。
IE 确实提供了高级设置“不要将加密的页面保存到磁盘”。
我怀疑这是问题的一部分,服务器告诉浏览器不要缓存文件,而 IE 启用了“不要将加密的页面保存到磁盘”。
是的,我知道对于较大的文件,上面的代码片段将是内存的主要拖累,并且这种实现将是有问题的。因此,真正的最终解决方案不会将整个文件打开为单个字节数组,而是将文件作为流打开,然后将文件以一口大小的块(例如大约 10K 大小)发送到客户端。
其他任何人都有类似的通过 ssl“流式传输”二进制文件的经验吗?有什么建议或建议吗?