Windows Vista Sidebar 盲人摸象笔记

        公司要弄个内部上传文件的小工具,一牛人说用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请求就组织好了,悄悄地把它发出去试试看吧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值