【发布时间】:2010-09-08 08:06:28
【问题描述】:
我希望将 SharePoint 2003 文档库中的文件流式传输到浏览器。基本上,这个想法是将文件作为流打开,然后将文件流“写入”到响应中,指定内容类型和内容处置标头。内容配置用于保存文件名,内容类型当然是为了提示浏览器打开什么应用程序来查看文件。
这在开发环境和 UAT 环境中运行良好。但是,在生产环境中,事情并不总是按预期工作,但仅限于 IE6/IE7。 FF 适用于所有环境。
请注意,在生产环境中启用并通常使用 SSL。 (当生产环境中不使用 SSL 时,文件流,按预期命名,并正确显示。)
这是一个代码sn-p:
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();
就像我说的,这段代码 sn-p 在开发机器和 UAT 环境中运行良好。将打开一个对话框并要求保存、查看或取消 Testme.doc。但仅在生产中使用 SSL 时,IE 6 和 IE7 不使用附件名称。相反,它使用发送流的页面名称 testheader.apx,然后引发错误。
IE 确实提供了高级设置“不将加密页面保存到磁盘”。
我怀疑这是问题的一部分,服务器告诉浏览器不要缓存文件,而 IE 启用了“不要将加密的页面保存到磁盘”。
是的,我知道对于较大的文件,上面的代码 sn-p 将是内存的主要拖累,并且这种实现将是有问题的。所以真正的最终解决方案不会将整个文件打开为单字节数组,而是将文件作为流打开,然后将文件以一口大小的块(例如大约 10K 大小)发送到客户端。
还有其他人有类似的通过 ssl“流式传输”二进制文件的经验吗?有什么建议或建议吗?
【问题讨论】:
-
抛出的错误是什么?此代码中没有 SharePoint……您当前的生产代码是这样吗?
-
未知 我代表尚未加入 SO 的同事发布此信息。你是对的,这段代码中没有共享点,这是一个精简的示例。生产代码确实与共享点文档库交互。我应该说得更清楚。
标签: asp.net sharepoint ssl binary streaming