RFC1867协议客户端实现Word下载.docx
- 文档编号:12980071
- 上传时间:2022-10-01
- 格式:DOCX
- 页数:12
- 大小:14.47KB
RFC1867协议客户端实现Word下载.docx
《RFC1867协议客户端实现Word下载.docx》由会员分享,可在线阅读,更多相关《RFC1867协议客户端实现Word下载.docx(12页珍藏版)》请在冰豆网上搜索。
在上图选择相应的文件,按Upload按钮即可把选择的文件上传到服务器(服务器端可用JspSmartUpload等组件接受文件)。
归根结底上传的所有操作都是由浏览器作的,用户所做的只是简单地选择了一下文件而已,接下来的问题是,如何能把一个目录中所有的文件实现一次性上传?
(1)因为目录下的文件数量是不定的,因此我们基本不可能通过增加多个&
标签的方式来解决问题。
(2)如果在Jsp中我们可以考虑以下方式来解决:
通过Jsp动态创建&
标签,并使所创建的标签不可见。
把每个标签的Value属性设置为每个文件的路径。
在按Upload时再实行一次性上传。
在我们试验了之后就会发现,对&
的Value属性赋值是徒劳的行为,因为RFC1867协议并没有要求浏览器的实现者一定实现Value属性,而IE恰好忽略了Value属性。
即以下代码将是徒劳的(IE中)
scriptlanguage=&
javascript&
//对Value赋值
Form1.file1.value=&
c:
\\aa.txt&
;
//执行后,IE将忽略此赋值
.script&
上述两种方式均无法完成我们需要的功能,接下来我们只能剖析IE是如何完成上传功能,把具体的实现方法用ActiveX或(Applet)来完成。
3.HTTP协议的简单介绍
一般说来我们认为HTTP协议是构建在TCP/IP之上的协议,其实HTTP协议本身无此限制,但因现实中多数情况均是如此,我们就姑且如此认为。
HTTP数据总体说来分三大部分:
(1)请求行,如下格式
(Request)POSTSPURLSPHTTP/1.1\r\n
请求方法+空格+请求URL+空格+HTTP协议版本+回车换行
如:
POSThttp:
//localhost:
8080/test/test.jspHTTP1.1\r\n
(Response)HTTP/1.1SP200SPOK\r\n
HTTP协议应答版本+空格+状态码+状态描述+回车换行
HTTP/1.1200OK\r\n
请求行主要是描述请求的URL,HTTP协议版本,应答状态等信息。
(2)请求头
在HttpServletRequest接口里已经封装了对HTTP头操作的方法。
如Content-type,Content-length,User-Agent,Host等都是HTTP头。
HTTP头主要描述了HTTP所传输数据的一些信息,如主机,数据内容类型,数据长度,代理类型等。
User-Agent:
myselfHttp/1.1\r\n
Accept:
www/source;
text/html;
image/gif;
*/*\r\n
HTTP头+:
+空格+头信息+回车换行
(3)HTTP实体
HTTP实体存放着,HTTP请求的内容,如参数信息,文本框的内容,隐含控件的值,ListBox的值等。
如果在页面上存在:
text&
name=&
userName&
value=&
zhangsan&
password&
123&
HTTP实体会出现以下形式:
(POST提交)
userName=zhangsan&
amp;
password=123
GET提交的时候需要解析HTTP请求行中的URL,在此不多作讨论。
4.RFC1867协议的数据格式
(1)RFC1867对HTTP头的变更
RFC1867对HTTP头作了适当地变更,但变更很小。
首先content-type头由以前的:
content-type:
application/x-www-form-urlencoded
变为
multipart/form-data;
+空格+
boundary=---------------------------7d52b133509e2
即增加了boundary,所谓的boundary其实就是分割线,下文将看到,RFC1867利用boundary分割HTTP实体数据。
boundary中数字字符区是随机生成的。
(2)对HTTP实体的变更
因为RFC1867增加了文件上传得功能,而上传文件内容自然也会被加入到HTTP的实体中。
现在因为既有HTTP一般的参数实体,又有上传文件的实体,所以用boundary把每种实体进行了分割,HTTP的实体看起来将是下面的样子:
-----------------------------7d52b133509e2
Content-Disposition:
form-data;
name="
file1"
filename="
\aa.txt"
Content-Type:
text/plain
文件内容在此处
userName"
zhangsan
password"
123
-----------------------------7d52b133509e2—
很明显,增加了文件上传后,HTTP实体变得稍微复杂了,首先是通过boundary把实体分开,以便于读取,然后对FileUpload的格式也作了限制。
(3)RFC1867协议的数据格式
根据RFC1867协议,在HTTP实体中必须对每个上传得文件有说明头,如:
指明内容类型是form-data
name="
:
指明页面上&
标签的名字是file1
filename="
指明上传文件在客户端上的全路径
空行:
文件头说明完毕后,要加一空行,以表示后面的数据是文件的内容
文件内容:
再接下来就是文件的内容
从这个角度说,完全可以利用HTTP协议+RFC1867协议开发基于文档管理应用程序。
5.协议的实现(客户端)
协议的好处就是,只要你提供的数据符合协议的要求,Server端就可以正确解析你的请求。
而不论数据是由IE产生的,或有你自己的Application产生的。
通过上面的分析,我们已经基本清楚了RFC1867协议的要求,只要我们打开指定的端口,把数据按照协议的要求写进去就会模拟出IE上传的功能。
用程序实现是非常Easy的事。
附件将给出Java实现版本,程序只是简单地实现了上传,根据我们前面的分析实现文件上传,参数传递这种稍麻烦的形式也是比较简单的。
另外,该程序并没有实现返回数据的解析,同样根据我们前面的分析,按照HTTP协议去解析返回的数据也不是难事。
总之,希望本程序能起到抛砖引玉的作用,关于RFC1867更深入的实现或应用,请跟作者联系。
6.代码实现
importjava.io.ByteArrayOutputStream;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
import.Socket;
publicclassHttpClient{
privateStringboundary=
"
---------------------------7d51372f1c05a8"
privateStringcontentType="
multipart/form-data;
boundary="
+boundary;
privatestaticfinalbyteCR=(byte)‘\r‘;
privatestaticfinalbyteLF=(byte)‘\n‘;
privatestaticfinalbyte[]CRLF=newbyte[]{CR,LF};
privateSocketsocket;
privateStringhost;
privateintport;
publicstaticvoidmain(String[]args){
try{
HttpClientclient=newHttpClient("
localhost"
8080);
//uploadfilearray
File[]files=newFile[1];
for(inti=0;
i&
files.length;
i++){
files[i]=newFile("
d:
\\aa.txt"
);
}
client.uploadFile(files);
}catch(Exceptione){
e.printStackTrace();
publicHttpClient(Stringhost,intport){
this
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- RFC1867 协议 客户端 实现