文件的上传

    文件上传是Web应用经常需要面对的问题,在大部分时候,用户的请求参数是在表单域输入的字符串,但如果为表单元素设置enctype="multipart/form-data"属性,则提交表单时不再以字符串方式提交请求参数,而是以二进制编码的方式提交请求,此时直接通过HttpServletRequest的getParameter方法无法正常获取请求参数的值,我们可以通过二进制流来获取请求内容-----通过这种方式,就可以取得希望上传文件的内容,从而实现文件的上传.

 

在一个Web工程中,要实现文件的上传,首先要把表单上传数据的编码方式设置为二进制数据方式,这就用到表单的enctype属性,这个属性可以有3个值:

  1. application/x-www-form-urlencoded:这是默认值,代表的方式适用范围比较广泛,只要是能输出页面的服务器环境都可以用。它处理表单域里的Value属性值,采用这种编码方式的表单会将表单域的值处理成URL编码方式。然而,在向服务器发送大量的文本、包含非ASCII字符的文本或二进制数据时,这种编码方式效率很低。
  2. multipart/form-data:上传二进制数据,这种编码方式会把文件域指定文件的内容也封装到请求参数中,只有使用这种编码方式,才能完整的传递文件数据,进行上传的操作。
  3. text/plain:这种编码方式当表单的action属性为mailto:URL的形式时比较方便,这种方式主要适用于直接通过表单发送电子邮件的方式。


      Java领域常用的两种框架:CommonFileUpload和COS,它们负责解析出HttpServletResquest请求中的所有域,不管是文件域还是普通表单域。一旦通过上传框架获得了文件域对应的文件内容,就可以通过IO流将文件内容写入服务器的任意位置, 从而完成文件上传。

 

使用Common-FileUpload框架实现文件上传
Common-FileUpload组件是apache的一个开源项目,是由jakarta项目组开发的一个功能强大的上传文件组件。该项目还依赖于另一个项目Common-IO。


要使用该框架,需要完成以下步骤:
1、登录http://jakarta.apache.org/commons/fileupload/站点,下载Common-FileUpload项目的最新发布版。
2、登录http://jakarta.apache.org/commons/io/站点,下载Commons-IO项目的最新发布版。
3、解压下载到的压缩文件,将commons-fileupload-1.2.jar和commons-io-1.3.1.jar复制到工程相应的类库中。

经过上面步骤,即可在Web应用中使用该框架了。该框架完成文件上传的关键类是ServletFileUpload,该类可以对HttpServletRequest请求进行分析,分析出该请求中的全部表单域。

 

 

使用COS框架实现文件上传

COS框架是oreilly组织下的一个小项目,它比Commons-FileUpload更加方便

要使用该框架,需要完成以下步骤:
1、登录http://www.servlets.com/cos站点,下载COS项目的最新发布版。
2、解压下载到的压缩文件,将cos.jar复制到工程相应的类库中。

经过上面步骤,即可在Web应用中使用该框架了。该框架完成文件上传的核心类是MultipartParse,该类用来解析该请求中的全部表单域。COS用Part实例代表了所有的表单域,不管是普通表单域还是文件域,都是Part实例。Part类有两个子类:ParamPart和FilePart,分别代表普通表单域和文件域。

 

Struts2的文件上传

struts2并未提供自己的请求解析器,它不会自己去处理multipart/form-data的请求,需要调用其他请求解析器。在default.properties配置文件中,可以看到如下配置:

# struts.multipart.parser=cos
# struts.multipart.parser=pell
struts.multipart.parser=jakarta

可见,Struts2默认使用的上传框架是Jakarta的Common-FileUpload框架,但可以通过修改struts.multipart.parser常量来使用其他的上传框架。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值