关于dsoframer控件保存文档至服务器的问题
				
									
					
					
						|  | 
							admin 2013年1月22日 21:27
								本文热度 5576 | 
					
				 
				
dsoframer是微软提供一款开源的基于web的office ActiveX控件,国内有达人在源码的基础上做了很多修改,增强了控件的功能。其实基于web的office是一个很鸡肋的东西,没有什么存在的意义。唯一的一点就是看上去比较花哨,你瞧,在浏览器上打开word文档,多吊啊。不知道原版dsoframer是否带有直接保存文档至服务器的功能,不过我手头上的一个改良版本的确是有此功能。
控件附带说明给出了保存文档至服务器的javascript函数,如:
 function SaveToWeb(){
 document.all.FramerControl1.HttpInit();
 document.all.FramerControl1.HttpAddPostCurrFile("FileData", "mydoc.doc");
 var err = document.all.FramerControl1.HttpPost("Http://202.114.12.137/newvan/pm/auxi/SaveDoc.aspx");
 if (!err)
 alert('保存失败!');
 else
 alert('保存成功!');
 }
 | 
由此可见,关键问题是如何实现SaveDoc.aspx模块。于是乎在网上搜索相应的解决方案,但没有一个能在服务器上成功保存正确的文件。失望之余索性将原文档和上传文档用UltraEdit打开进行二进制级比较,然后抓包分析POST数据时http数据包的格式,最后终于找到了解决的办法,贴出来供遇到同样问题的朋友参考,代码如下:
 BinaryReader bReader = new BinaryReader(Request.InputStream);string strTemp = Encoding.GetEncoding("iso-8859-1").GetString(
 bReader.ReadBytes((int)bReader.BaseStream.Length), 0, (int)bReader.BaseStream.Length);
 string match = "Content-Type: application/mswordrnrn";
 int pos = strTemp.IndexOf(match) + match.Length;
 bReader.BaseStream.Seek(pos, SeekOrigin.Begin);
 
 string newFile = Server.MapPath(".") + "\MyFile2.doc";
 FileStream newDoc = new FileStream(newFile, FileMode.Create, FileAccess.Write);
 BinaryWriter bWriter = new BinaryWriter(newDoc);
 bWriter.BaseStream.Seek(0, SeekOrigin.End);
 
 while (bReader.BaseStream.Position < bReader.BaseStream.Length - 38)
 bWriter.Write(bReader.ReadByte());
 
 bReader.Close();
 bWriter.Flush();
 bWriter.Close();
 
 | 
    这里应该注意的是,从字节流中获取字符串时一定要采用iso-8859-1的编码方式,不要采用utf-8或其他,因为utf-8会将asci字符也扩展成相应的unicode双字节形式。原理很简单,代码面前了无秘密。
 
该文章在 2013/1/22 21:27:18 编辑过