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的格式,我不知道如何在服务器端捕捉这东西,还好网上找到了个牛人代码,从代码上大致能够猜得出来。我猜是这样的:
这是普通变量的格式,比如网页中的一个输入框,POST出去的时候格式就是这样的。那文件类型的INPUT标签,POST出去是什么样的呢?LOOK
要注意上面是印象图,真正写成代码的时候有换行的地方都要以换行符代替的。我吃了这个亏,上面POST文件的时候,文件名后面没加换行符,导致服务器端收到的文件都以ocet-stream为文件名,郁闷了一小下。js组织格式的代码大致是这样的:
this.byteToHex(this.binaryStream)这句代码也是要注意的,POST以16进制格式传递文件内容,格式不正确会导致服务器端接受的文件内容为空。binaryStream是二进制流,通过ADODB.Stream来获得,我是这样写的:
二进制流到十六进制的转换也借助ActiveX来完成 :
这样,一个像模像样的文件上传POST请求就组织好了,悄悄地把它发出去试试看吧。
保存链接先
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"'
“变量值”
--------分界符--------
'Content-Disposition: form-data; name="变量1"'
“变量值”
--------分界符--------
这是普通变量的格式,比如网页中的一个输入框,POST出去的时候格式就是这样的。那文件类型的INPUT标签,POST出去是什么样的呢?LOOK
--------分界符--------
'Content-Disposition: form-data; name="uploadedfile"; filename="'
“文件名”
'Content-Type: application/octet-stream'
文件内容
--------分界符--------
'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;
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();
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));
}
var xmldom = new ActiveXObject("Microsoft.XMLDOM");
var byteObj= xmldom.createElement("byteObj");
byteObj.dataType = 'bin.hex';
byteObj.nodeTypedValue = byteStr;
return(String(byteObj.text));
}
这样,一个像模像样的文件上传POST请求就组织好了,悄悄地把它发出去试试看吧。
- Windows Vista Sidebar 盲人摸象笔记
- Windows Vista Sidebar for XP
- Windows Vista Sidebar for XP
- Windows Vista Sidebar for XP
- Windows Vista Sidebar for XP
- Windows Vista Sidebar for XP
- Windows Vista Sidebar for XP
- Windows Vista Sidebar for XP
- Windows Vista Sidebar for XP
- Windows Vista Sidebar for XP
- Windows Vista Sidebar for XP
- Windows Vista Sidebar for XP
- Windows Vista Sidebar for XP
- Windows Vista Sidebar for XP
- Windows Vista Sidebar for XP
- Windows Vista Sidebar(边栏小工具)
- 盲人摸象
- 终于赶上Vista Sidebar Gadgets大赛了
- String Model
- asp字符替换
- Asp.Net2.0开发功能概览
- VS2005常用快捷键
- Hibernate 两表左连接的问题
- Windows Vista Sidebar 盲人摸象笔记
- 教案:Java第9章 字符串
- C#读取系统硬件信息
- window.showModalDialog()如何传递参数
- JDK1.5新特性介绍
- 解决微软盗版
- InstantObjects参考 - delphi的ORM实现
- 从 SQL 到 LINQ: 合并, TOP, 子查询 (Bill Horst)
- 用 CMD 脚本获得当前 svn 目录下各文件及目录的最大 revision 号