dsoframer是微軟提供一款開源的基于web的office ActiveX控件,國內(nèi)有達人在源碼的基礎(chǔ)上做了很多修改,增強了控件的功能。其實基于web的office是一個很雞肋的東西,沒有什么存在的意義。唯一的一點就是看上去比較花哨,你瞧,在瀏覽器上打開word文檔,多吊啊。不知道原版dsoframer是否帶有直接保存文檔至服務(wù)器的功能,不過我手頭上的一個改良版本的確是有此功能。
控件附帶說明給出了保存文檔至服務(wù)器的javascript函數(shù),如:
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('保存成功!'); }
|
由此可見,關(guān)鍵問題是如何實現(xiàn)SaveDoc.aspx模塊。于是乎在網(wǎng)上搜索相應(yīng)的解決方案,但沒有一個能在服務(wù)器上成功保存正確的文件。失望之余索性將原文檔和上傳文檔用UltraEdit打開進行二進制級比較,然后抓包分析POST數(shù)據(jù)時http數(shù)據(jù)包的格式,最后終于找到了解決的辦法,貼出來供遇到同樣問題的朋友參考,代碼如下:
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();
|
這里應(yīng)該注意的是,從字節(jié)流中獲取字符串時一定要采用iso-8859-1的編碼方式,不要采用utf-8或其他,因為utf-8會將asci字符也擴展成相應(yīng)的unicode雙字節(jié)形式。原理很簡單,代碼面前了無秘密。
該文章在 2013/1/22 21:27:18 編輯過