




免费预览已结束,剩余13页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
精选资料RFC1867协议客户端实现 /windwl/archive/2007/03/02/1518868.aspxRFC1867协议客户端实现 1. RFC1867协议介绍 RFC1867协议主要是在HTTP协议的基础上为INPUT标签增加了file属性,同时限定了Form的method必须为POST,ENCTYPE必须为multipart/form-data。当然还增加了一些与此相关属性,但都不是很重要,我们在此不作讨论。 在一般的基于Web的程序中,我们往往使用<input type=file>标签,该标签在被浏览器解析后会产生一个文本框和一个浏览按钮,单击浏览按钮会出现系统的文件选择框。其经典表示如下图所示。 2. 执行上传及<input type=file>标签的一些特性 在上图选择相应的文件,按Upload按钮即可把选择的文件上传到服务器(服务器端可用JspSmartUpload等组件接受文件)。归根结底上传的所有操作都是由浏览器作的,用户所做的只是简单地选择了一下文件而已,接下来的问题是,如何能把一个目录中所有的文件实现一次性上传? (1) 因为目录下的文件数量是不定的,因此我们基本不可能通过增加多个<input type=file>标签的方式来解决问题。 (2) 如果在Jsp中我们可以考虑以下方式来解决:通过Jsp动态创建<input type=file>标签,并使所创建的标签不可见。把每个标签的Value属性设置为每个文件的路径。在按Upload时再实行一次性上传。在我们试验了之后就会发现,对<input type=file>的Value属性赋值是徒劳的行为,因为RFC1867协议并没有要求浏览器的实现者一定实现Value属性,而IE恰好忽略了Value属性。 即以下代码将是徒劳的(IE中) <script language=javascript> /对Value赋值 Form1.file1.value=c:aa.txt; /执行后,IE将忽略此赋值 <.script> 上述两种方式均无法完成我们需要的功能,接下来我们只能剖析IE是如何完成上传功能,把具体的实现方法用ActiveX或(Applet)来完成。 3. HTTP协议的简单介绍 一般说来我们认为HTTP协议是构建在TCP/IP之上的协议,其实HTTP协议本身无此限制,但因现实中多数情况均是如此,我们就姑且如此认为。HTTP数据总体说来分三大部分: (1) 请求行,如下格式 (Request) POST SP URL SP HTTP/1.1 rn 请求方法+空格+请求URL+空格+HTTP协议版本+回车换行 如:POST http:/localhost:8080/test/test.jsp HTTP1.1rn (Response)HTTP/1.1 SP 200 SP OK rn HTTP协议应答版本+空格+状态码+状态描述+回车换行 如:HTTP/1.1 200 OK rn 请求行主要是描述请求的URL,HTTP协议版本,应答状态等信息。 (2) 请求头 在HttpServletRequest接口里已经封装了对HTTP头操作的方法。如Content-type,Content-length,User-Agent,Host等都是HTTP头。HTTP头主要描述了HTTP所传输数据的一些信息,如主机,数据内容类型,数据长度,代理类型等。 如: User-Agent: myselfHttp/1.1rn Accept: www/source; text/html; image/gif; */*rn HTTP头+:+空格+头信息+回车换行 (3) HTTP实体 HTTP实体存放着,HTTP请求的内容,如参数信息,文本框的内容,隐含控件的值,ListBox的值等。如果在页面上存在: <input type=text name=userName value=zhangsan> <input type=password name=password value=123> HTTP实体会出现以下形式:(POST提交) userName=zhangsan&password=123 GET提交的时候需要解析HTTP请求行中的URL,在此不多作讨论。 4. RFC1867协议的数据格式 (1) RFC1867对HTTP头的变更 RFC1867对HTTP头作了适当地变更,但变更很小。首先content-type头由以前的: content-type: application/x-www-form-urlencoded 变为 content-type: 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=c:aa.txt Content-Type: text/plain 文件内容在此处 -7d52b133509e2 Content-Disposition: form-data; name=userName zhangsan -7d52b133509e2 Content-Disposition: form-data; name=password 123 -7d52b133509e2 很明显,增加了文件上传后,HTTP实体变得稍微复杂了,首先是通过boundary把实体分开,以便于读取,然后对FileUpload的格式也作了限制。 (3) RFC1867协议的数据格式 根据RFC1867协议,在HTTP实体中必须对每个上传得文件有说明头,如: Content-Disposition: form-data; name=file1; filename=c:aa.txt Content-Disposition:指明内容类型是form-data name=file1:指明页面上<input type=file>标签的名字是file1 filename=c:aa.txt:指明上传文件在客户端上的全路径 空行:文件头说明完毕后,要加一空行,以表示后面的数据是文件的内容 文件内容:再接下来就是文件的内容 从这个角度说,完全可以利用HTTP协议+RFC1867协议开发基于文档管理应用程序。 5. 协议的实现(客户端) 协议的好处就是,只要你提供的数据符合协议的要求,Server端就可以正确解析你的请求。而不论数据是由IE产生的,或有你自己的Application产生的。通过上面的分析,我们已经基本清楚了RFC1867协议的要求,只要我们打开指定的端口,把数据按照协议的要求写进去就会模拟出IE上传的功能。用程序实现是非常Easy的事。附件将给出Java实现版本,程序只是简单地实现了上传,根据我们前面的分析实现文件上传,参数传递这种稍麻烦的形式也是比较简单的。另外,该程序并没有实现返回数据的解析,同样根据我们前面的分析,按照HTTP协议去解析返回的数据也不是难事。总之,希望本程序能起到抛砖引玉的作用,关于RFC1867更深入的实现或应用,请跟作者联系。 6. 代码实现 import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import .Socket; public class HttpClient private String boundary = -7d51372f1c05a8; private String contentType = multipart/form-data; boundary=+boundary; private static final byte CR = (byte)r; private static final byte LF = (byte)n; private static final byte CRLF = new byteCR,LF; private Socket socket; private String host; private int port; public static void main(String args) try HttpClient client = new HttpClient(localhost,8080); /upload file array File files = new File1; for(int i=0;i<files.length;i+) filesi = new File(d:aa.txt); client.uploadFile(files); catch(Exception e) e.printStackTrace(); public HttpClient(String host,int port) this.host = host; this.port = port; private void openServer() throws Exception socket = new Socket(host,port); private void closeServer() throws Exception if(socket!=null) socket.close(); private void addHead(int contentLength,OutputStream out) throws IOException /request line,end withd CRLF write(out,POST http:/localhost:8080/test1/upload/1 HTTP/1.1); out.write(CRLF); /request head fields write(out,User-Agent: SysmitAgent); out.write(CRLF); write(out,Host: localhost:8080); out.write(CRLF); write(out,Accept: www/source; text/html; image/gif; */*); out.write(CRLF); write(out,Accept-Encoding: gzip, deflate); out.write(CRLF); /entity head fields write(out,Content-Type: +contentType); out.write(CRLF); write(out,Content-Length: +contentLength); out.write(CRLF); out.write(CRLF); private void addBody(File file,OutputStream out) throws IOException /write boundary write(out,boundary); out.write(CRLF); /write file info String disposition = Content-Disposition: + form-data; + name=file1; + filename= +file.getAbsolutePath()+; write(out,disposition); out.write(CRLF); /write file content type info write(out,Content-Type: text/html); out.write(CRLF); /write SP(empty line) out.write(CRLF); /write file content InputStream is = new FileInputStream(file); byte b = new byte1024; int count = is.read(b); while(count!=-1) out.write(b,0,count); count = is.read(b); is.close(); /writ
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 民爆安全培训制度课件
- 民法总论课件付俊伟
- 川职单招考试真题及答案
- 餐饮升职考试题库及答案
- 光迅科技新质生产力实践
- 中国新质生产力的实践图景
- 绿色新质生产力发展模式
- 人才新质生产力专题会议
- 中考备考方案
- “五四”青年节主题活动方案
- 2025年职业病诊断医师资格考试(职业性尘肺病及其他呼吸系统疾病)历年参考题库含答案详解(5卷)
- 2025年医保知识考试试题及答案解析
- 2025年农电招聘面试题目及答案
- 活动挂名管理办法
- 高校基地管理办法
- 超声科法律法规与工作规范
- 01 华为采购管理架构(20P)
- 企业购电计划方案(3篇)
- 星级酒店室内装修施工合同
- 2025-2030中国三维光学表面轮廓仪行业市场发展趋势与前景展望战略研究报告
- 肾小球肾炎课件
评论
0/150
提交评论