`
DLevin
  • 浏览: 36891 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

【转】通过 http 协议上传文件(rfc1867协议概述,jsp 应用举例,客户端发送内容构造)

阅读更多

1、概述
在最初的 http 协议中,没有上传文件方面的功能。 rfc1867 (
http://www.ietf.org/rfc/rfc1867.txt
) 为 http 协议添加了这个功能。客户端的浏览器,如 Microsoft IE, Mozila, Opera 等,按照此规范将用户指定的文件发送到服务器。服务器端的网页程序,如 php, asp, jsp 等,可以按照此规范,解析出用户发送来的文件。
Microsoft IE, Mozila, Opera 已经支持此协议,在网页中使用一个特殊的 form 就可以发送文件。
绝大部分 http server ,包括 tomcat ,已经支持此协议,可接受发送来的文件。
各种网页程序,如 php, asp, jsp 中,对于上传文件已经做了很好的封装。

2、上传文件的实例:用 servelet 实现(http server 为 tomcat 4.1.24)
1. 在一个 html 网页中,写一个如下的form :

<form enctype="multipart/form-data"  action="http://192.168.29.65/UploadFile" method=post >

     load multi files :<br>

     <input name="userfile1" type="file" ><br>

     <input name="userfile2" type="file"><br>

     <input name="userfile3" type="file"><br>

     <input name="userfile4" type="file"><br>

     text field :<input type="text" name="text" value="text"><br>

     <input type="submit" value=" 提交 "><input type=reset>

</form>

 

2. 服务端 servelet 的编写
现在第三方的 http upload file 工具库很多。Jarkata 项目本身就提供了fileupload 包http://jakarta.apache.org/commons/fileupload/  。文件上传、表单项处理、效率问题基本上都考虑到了。在 struts 中就使用了这个包,不过是用 struts 的方式另行封装了一次。这里我们直接使用 fileupload 包。至于struts 中的用法,请参阅 struts 相关文档。
这个处理文件上传的 servelet 主要代码如下:

public void doPost( HttpServletRequest request, HttpServletResponse response ) {

     DiskFileUpload diskFileUpload = new DiskFileUpload();

     //  允许文件最大长度

     diskFileUpload.setSizeMax( 100*1024*1024 );

     //  设置内存缓冲大小

     diskFileUpload.setSizeThreshold( 4096 );

     //  设置临时目录

     diskFileUpload.setRepositoryPath( "c:/tmp" );

 

     List fileItems = diskFileUpload.parseRequest( request );

     Iterator iter = fileItems.iterator();

     for( ; iter.hasNext(); ) {

         FileItem fileItem = (FileItem) iter.next();

         if( fileItem.isFormField() ) {

             //  当前是一个表单项

             out.println( "form field : " + fileItem.getFieldName() + ", " + fileItem.getString() );

         } else {

             //  当前是一个上传的文件

             String fileName = fileItem.getName();

             fileItem.write( new File("c:/uploads/"+fileName) );

         }

     }

}

 

 

为简略起见,异常处理,文件重命名等细节没有写出。

3、 客户端发送内容构造

假设接受文件的网页程序位于 http://192.168.29.65/upload_file/UploadFile .
假设我们要发送一个二进制文件、一个文本框表单项、一个密码框表单项。文件名为 E:\s ,其内容如下:(其中的XXX代表二进制数据,如 01 02 03)

a

bb

XXX

ccc

 

 

客户端应该向  192.168.29.65  发送如下内容:

 

POST /upload_file/UploadFile HTTP/1.1

Accept: text/plain, */*

Accept-Language: zh-cn

Host: 192.168.29.65:80

Content-Type:multipart/form-data;boundary=---------------------------7d33a816d302b6

User-Agent: Mozilla/4.0 (compatible; OpenOffice.org)

Content-Length: 424

Connection: Keep-Alive

 

-----------------------------7d33a816d302b6

Content-Disposition: form-data; name="userfile1"; filename="E:\s"

Content-Type: application/octet-stream

 

a

bb

XXX

ccc

-----------------------------7d33a816d302b6

Content-Disposition: form-data; name="text1"

 

foo

-----------------------------7d33a816d302b6

Content-Disposition: form-data; name="password1"

 

bar

-----------------------------7d33a816d302b6--

 

 

此内容必须一字不差,包括最后的回车。
注意:Content-Length: 424 这里的424是红色内容的总长度(包括最后的回车)
注意这一行:
Content-Type: multipart/form-data; boundary=---------------------------7d33a816d302b6
根据 rfc1867, multipart/form-data是必须的.
---------------------------7d33a816d302b6 是分隔符,分隔多个文件、表单项。其中33a816d302b6 是即时生成的一个数字,用以确保整个分隔符不会在文件或表单项的内容中出现。前面的 ---------------------------7d 是 IE 特有的标志。 Mozila 为---------------------------71
用手工发送这个例子,在上述的 servlet 中检验通过。

 

(上面有一个回车)

 

 

用户可以选择多个文件,填写表单其它项,点击“提交”按钮后就开始上传给  http://192.168.29.65/upload_file/UploadFile  这是一个 servelet 程序
注意 enctype="multipart/form-data", method=post, type="file" 。根据 rfc1867, 这三个属性是必须的。multipart/form-data 是新增的编码类型,以提高二进制文件的传输效率。具体的解释请参阅 rfc1867

--kaixuan's cnblogs
分享到:
评论

相关推荐

    RFC中文文档-txt

    RFC1867 HTML中基于表单的文件上传 RFC1869 SMTP服务扩展 RFC1878 变量长度子网表格用于IPv4 RFC1883 Internet协议,版本6(IPv6)说明书 RFC1901 基于社区的SNMPv2介绍 RFC1904 简单网络管理协议(SNMPv2)版本 2的一致...

    HTTP协议详解及RFC2616(HTTP)中文版

    HTTP协议详解 RFC2616(HTTP)中文版 pdf 格式,高清

    中文版RFC,共456

    RFC1867 HTML中基于表单的文件上传 RFC1869 SMTP服务扩展 RFC1878 变量长度子网表格用于IPv4 RFC1883 Internet协议,版本6(IPv6)说明书 RFC1901 基于社区的SNMPv2介绍 RFC1904 简单网络管理协议(SNMPv2)版本 2的一致...

    http 协议英文文档 rfc2616

    rfc2616 http 协议英文文档

    RFC7252-受限应用协议(CoAP协议中文版).pdf

    该文在详细介绍了CoAP协议的内容、特点和交互模型后,在uIPv6 START KIT无线网络开发套件上,使用Contiki嵌入式操作系统,不仅在浏览器端实现了CoAP协议而且用自己编写的客户端程序实现了CoAP协议,增加了和数据库...

    Ftp协议:RFC959和HTTP协议:RFC2616

    Ftp协议:RFC959和HTTP协议:RFC2616

    http协议详解,http-rfc

    http协议详解,http-rfc(Request For Comments(RFC),是一系列以编号排定的文件。文件收集了有关互联网相关信息,以及UNIX和互联网社区的软件文件。目前RFC文件是由Internet Society(ISOC)赞助发行。基本的...

    PHP 文件上传源码分析(RFC1867)

    可以应用的上传方式有PUT, WEBDAV, 和RFC1867三种, 本文将分析在PHP中,是如何基于RFC1867实现文件上传的. RFC1867 RCF1867是Form-based File Upload in HTML标准协议, RFC1867标准对HTML做出了两处修改: 1 为...

    rfc中文文档目录,包含部分翻译

    RFC1867 HTML中基于表单的文件上传 RFC1869 SMTP服务扩展 RFC1878 变量长度子网表格用于IPv4 RFC1881 IPv6 地址分配管理 RFC1883 Internet协议,版本6(IPv6)说明书 RFC1886 DNS扩展支持IP版本6 RFC1901 基于...

    http协议rfc

    http协议的rfc文档,txt,学习http协议的标准和参考文档

    SSH协议相关rfc文档

    本资源包含了SSH协议相关的主要rfc文档 其中有: rfc4250 The Secure Shell SSH Protocol Assigned Numbers pdf rfc4251 The Secure Shell SSH Protocol Architecture pdf rfc4252 The Secure Shell SSH ...

    RFC868 客户端校时工具

    一个RFC868 客户端校时工具,可以自己设置校时间隔,没有考虑网络延时。

    中文RFC文档.zip

    RFC1461 通过X.25多协议互连SNMP管理系统库(MIB)扩展 RFC1469 通过令牌-环局域网的IP多点传送 RFC1483 通过ATM适应层5的多协议封装 RFC1558 LDAP研究过滤器的字符串表达 RFC1571 Telnet环境选项互用性问题 RFC1590...

    http协议RFC中文版

    RFC1945(HTTP)中文版.pdf RFC2616(HTTP)中文版.pdf

    RFC8001~RFC9000(共644个rfc标准的pdf文档) 计算机网络+互联网标准+网络协议+RFC标准+网络协议开发及

    附件压缩包包含了RFC8001~RFC9000之间的所有RFC文档原文,共计644个RFC标准的pdf文档,希望对你有所帮助。 Request For Comments(RFC),是一系列以编号排定的文件。文件收集了有关互联网相关信息,以及UNIX和...

    RFC951_引导协议(BOOTP).doc

    引导协议(BOOTP) (RFC951-BOOTSTRAP PROTOCOL (BOOTP)) 本备忘录的状态 本RFC文档向ARPA-Internet社区提供一个被提议的协议,需要进一步进行讨论和建议以得到改进。 本文档无发布限制。 目录 1 概述 2 2 包格式...

    RFC1305-NTP协议

    NTP协议,也称为网络时间协议,实现终端与网络时间的同步.RFC1305是NTP标准.相信对研究NTP有些帮助.

    HTTP1.1协议中文版RFC2616

    HTTP1.1协议中文版RFC2616

    路由协议 中文rfc

    路由协议 中文rfc RFC1387_RIP(版本2)协议分析中文版

    HTTP协议(RFC2616)中文版

    HTTP协议(RFC2616)中文版.docx

Global site tag (gtag.js) - Google Analytics