Windows Vista Sidebar 盲人摸象笔记

来源:互联网 发布:惠州市干部网络大学堂 编辑:程序博客网 时间:2024/05/06 22:48
        公司要弄个内部上传文件的小工具,一牛人说用Gadget,于是头儿决定用Gadget。Gadget 啥玩艺儿?咋跟服务器通信?能用现成的协议不?行不行啊到底?答曰:不知道。不知道咋整?学!有MSDN论坛的Sidebar开发版面,再加上API参 考,摸着看吧。
        保存链接先
       MSDN Forums:
        http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=1063&SiteID=1
      Windows Sidebar Library:
        http://msdn2.microsoft.com/en-us/library/aa965850%28VS.85%29.aspx

       第一摸,这东西和网页差不多嘛。HTML+CSS+JavaScript,不过多了一些官方支持,System.Shell之类的Windows Object。恩,Co起来不是很难的样子。
       难的是没有详细的式样书。Boss灵光一动,今天说给我整这个功能出来吧,明天又要那个功能,拿哥们当机器猫用啊。。。我可没有那些希奇玩意,宝贝倒是有 一件,不过最近这宝贝好像越来越大了。。。开发最怕这个——没详细式样,不好从整体上把握架构,一不小心走错一步,后面再改就麻烦大了。本来想随便写写凑合用就好了,现在看来,必须要考虑将来的 扩展性,维护性,重用性,还有新人加入的易上手性等等,还是悠着点Co比较好。
       初步构想是在Gadget中使用System.Shell.itemFromFileDrop方法来捕捉文件的托拽事件,然后使用Ajax发送请求,在服务端用php处理请求并生成XML文档作为响应。但是Gadget不是浏览器,不能像做网页一样整一个file类型的标签,弄个按钮submit一下,咋整呢?笨人有笨办法,Ajax发送请求的时候是可以传递参数的,如果把这个参数做成和普通网页上传的http请求POST内容一致的话,不就可以了。就是说我们要伪装一个POST。
       要伪装首先就要了解这个POST的格式,我不知道如何在服务器端捕捉这东西,还好网上找到了个牛人代码,从代码上大致能够猜得出来。我猜是这样的:

--------分界符--------
'Content-Disposition: form-data; name="变量1"'
“变量值”
--------分界符--------


    这是普通变量的格式,比如网页中的一个输入框,POST出去的时候格式就是这样的。那文件类型的INPUT标签,POST出去是什么样的呢?LOOK
--------分界符--------
'Content-Disposition: form-data; name="uploadedfile"; filename="'
“文件名”
'Content-Type: application/octet-stream'
文件内容
--------分界符--------

    要注意上面是印象图,真正写成代码的时候有换行的地方都要以换行符代替的。我吃了这个亏,上面POST文件的时候,文件名后面没加换行符,导致服务器端收到的文件都以ocet-stream为文件名,郁闷了一小下。js组织格式的代码大致是这样的:

var boundaryString = 'lookout';
boundary 
= '--' + boundaryString;
var requestbody = boundary + '/n' 
            
+ 'Content-Disposition: form-data; name="submit"' + '/n' 
            + "ok" + '/n' 
            + boundary + '/n' 
            
+ 'Content-Disposition: form-data; name="uploadedfile"; filename="' 
            
+ this.path + '"'+ '/n'
            
+ 'Content-Type: application/octet-stream' + '/n' 
            + this.byteToHex(this.binaryStream)
            
+ '/n'
            
+ boundary;
   
   this.byteToHex(this.binaryStream)这句代码也是要注意的,POST以16进制格式传递文件内容,格式不正确会导致服务器端接受的文件内容为空。binaryStream是二进制流,通过ADODB.Stream来获得,我是这样写的:

var stream = new ActiveXObject("ADODB.Stream");
stream.Type 
= 1;
stream.Open();
stream.LoadFromFile(
this.path);
this.binaryStream = stream.Read();
stream.close();
 
  二进制流到十六进制的转换也借助ActiveX来完成  :

byteToHex : function(byteStr){
    
var xmldom = new ActiveXObject("Microsoft.XMLDOM");
    
var byteObj= xmldom.createElement("byteObj");
    byteObj.dataType 
= 'bin.hex';
    byteObj.nodeTypedValue 
= byteStr;
    
return(String(byteObj.text));
}
 
    这样,一个像模像样的文件上传POST请求就组织好了,悄悄地把它发出去试试看吧。