`
coconut_zhang
  • 浏览: 532525 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

strtus2.0实现上传

 
阅读更多

Struts 2是通过Commons FileUpload文件上传。
1.Commons FileUpload通过将HTTP的数据保存到临时文件夹,我们可以设置保存临时文件夹的路径,若不设置那么它会放到tomcat服务器安装目录下\work\Catalina\localhost\你的项目名下的文件夹;如我的将上传文件项目Struts2Upload发布到tomcat后,那么上传的文件的临时文件会保存形如:D:\Java\apache-tomcat-6.0.20\work\Catalina\localhost\Struts2Upload\upload_243601eb_1277f7c2df8__7ffc_00000001.tmp,我们在action类里再相当于本地的资源一样来读取,再转移到如数据库等的地方去。总之,我觉得上传文件时,数据会随用户的提交,而由浏览器端将识别出的传输文件标签,将本地的文件转化为文件流,再通过建立好的tcp连接(每次用户访问一个页面时,会建立tcp连接,服务器应答完响应后会断开连接),将数据上传至服务器,应该是这样,而不是用服务器端的action类或servlet类来完成传输的,应该是浏览器对上传文件标签的解析,从而完成本地资源的传输的。
2.然后Struts使用fileUpload拦截器将文件绑定到Action的实例中。从而我们就能够以本地文件方式的操作浏览器上传的文件。

以下是例子所依赖类包的列表:
commons-fileupload-1.2.1.jar
commons-io-1.3.2.jar
commons-logging-1.0.4.jar
freemarker-2.3.8.jar
ognl-2.6.11.jar
struts2-core-2.0.14.jar
xwork-2.0.7.jar

注意:
1.页面的表单enctype须设置为"multipart/form-data";
2.<s:file name="loadFile">标签将上传文件赋值给ACTION中的File loadFile属性,并且将文件名,文件类型都会邦定到action类里去,就上面这个标签例子,action类里可以邦定如下属性:
/*
  * 一个loadFile,
  * 不但须设置setLoadFile(),
  * 还需要设置setLoadFileContentType(String contentType):获取上传文件的MIME类型
  *         setLoadFileFileName(String fileName):上传文件的文件名,此文件名不包括文件路径
  * 因此:
  * <s:file name="xxx">,则ACTION中要有三个对应的setter方法:
  * setxxx(),  
  * setxxxContentType(String contentType)
  * setxxxFileName(String fileName)   
  * */
private File loadFile;
private String contentType;
private String fileName;
(2)能获取到本地文件信息,那在服务器端的操作就很容易了。

strtus2.0实现下载
(1) 实现下载也不难,在页面上显示待下载的资源的链接,将链接与action类链接起来,当用户点击时,会到action类去, action类里得到下载资源的路径(这个路径一般写在配置文件或者从数据库里查出来),有路径就可以给出一个读取服务器端资源的输入流,并将该流交邦定给页面端。这主要是用struts.xml配置来实现:<result name="success" type="stream">这句可以将从action类跳转到页面时,以输出流的形式跳转,当浏览器识别出是以流的形式返回的页面时,它会弹出一个保存(打开)的对话框,从而实现下载的功能,上面都是我个人理解,如有不对,希望大家直接指出。
(2) 以流的形式跳转到页面前,我们可以给出其它参数:
     contentType:文件类型
     inputName:这个就是文件流,主要的参数,其它都是辅助说明
     contentDisposition:这个是文件的描述
     bufferSize:缓冲的大小,这个我没研究过,可能还有其它参数,我没时间去研究,所以就列出这几个。
    这样后在页面端弹出的保存文件对话框会将contentDisposition的信息在“名称”那里显示出来。
(3) 下载还涉及到中文文件名等的问题,所以也要处理,具体可以参考如下文章:
http://shenzhenchufa.blog.51cto.com/730213/271288

当我们用struts2进行文件上传时,首先要将from表单的enctype属性进行重新设置。那么该属性的取值就是决定表单数据的编码方式。一般有三个属性取值:

application/x-www-form-urlencoded:默认的编码方式,它只处理表单域里的value属性,采用这种编码方式的表单会将表单域的值处理成URL编码方式。这种方式按ISO-8859-1的编码方式将表单上传到服务器,但是这种方式是上传不了文件的。那么如果我们上传的含有文件域则采用下面的方式(multipart/form-data)。

multipart/form-data:这种编码方式会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数里。(进行文件上传时采用这种方式)

text/plain:这种编码方式当表单的action属性为mailto:URL的形式时比较方便,这种方式主要用于直接通过表单发送邮件的方式。(这种方式已经不再采用了)
注:
如果要实现文件的上传,则表单的method属性必须设置成:post提交方式。
如果要实现文件的上传,表单的enctype属性必须设置成:multipart/form-data。
一旦设置了表单的enctype="multipart/form-data" (即:<form action="" method="post" enctype="multipart/form-data">)属性,就无法通过HttpServletRequest对象的getParameter()方法获取请求参数值。(就是说除了文件域以外其他的普通表单域(如:文本框、单选框、复选框、文本域等)则取不到)

对于Java应用而言,比较常用的上传框架有两个:common-fileupload和cos,这两个框架都是负责解析出HttpServletRequest请求中的所有域。通过上传框架获得了文件域对应的文件内容,就可以通过IO流将文件内容写入服务器的任意位置。在项目开发中一般使用common-fileupload框架较多,当然针对不同的需求使用不同的上传框架,使用该框架一般需要使用如下两个jar文件:
commons-fileupload-1.2.1.jar    commons-io-1.3.2.jar

Struts2并未提供自己的请求解析器,因此Struts2并不会自己去处理multipart/form-data的请求,它需要调用其他请求解析器(如:common-fileupload或cos),将HTTP请求中的表单域解析出来,但是Struts2在原有的上传解析器基础上做了进一步封装,更进一步简化了文件上传。查看一下xml文件就能找到Strus2对应的文件上传拦截器,当然并不需要我们自己去配置,struts2已经为我们配完了,直接用就可以了。
根据实际情况定到底要选择哪个上传控件,到default.properties属性文件中去查看struts2支持哪些上传控件,自己配一下就可以了,但是别忘记拷Jar包。
Struts2默认使用Jakarata的Common-FileUpload框架实现文件上传,如果使用其它两个框架则只需要修改struts.multipart.parser常量,同时在Web工程中增加相应的上传框架的jar文件即可。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics