要实现Struts2框架的文件上传,须要用到2个jar包html
因为文件解析Struts2内部已经帮咱们作好了,大大下降了开发难度,咱们只须要在Action里设置好对应的参数,目录进行使用便可。java
来个小示例:程序员
upload.jspapache
这个页面的表单有三点须要注意的:app
一、表单必须使用post方式提交 二、表单编码类型 enctype="multipart/form-data" 三、<s:file label="上传文件:" name="upload"></s:file> name属性必需要写框架
1 <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> 2 <%@ taglib prefix="s" uri="/struts-tags" %> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 7 <title>上传文件示例</title> 8 </head> 9 <body> 10 <s:actionerror/> 11 <s:fielderror/> 12 <s:form action="upload.action" theme="simple" namespace="/" method="post" enctype="multipart/form-data"> 13 <s:file label="上传文件:" name="upload"></s:file> 14 <s:submit value="提交上传"></s:submit> 15 </s:form> 16 </body> 17 </html>
UploadAction.javajsp
这里有几个注意点:工具
一、三个成员变量的命名是有规范的:post
private File upload里的的upoload同样要和你上传提交页面里的name属性值对应一致ui
文件类型和文件名命名分别为:页面name属性值+ContentType,页面name属性值+FileName
二、提供setter方法,以便接收对应的数据
三、定义目标文件存放处,用commons-io-2.0.1.jar包提供的FileUtils工具类把上传文件复制到指定位置
1 package com.lcw.struts2.upload; 2 3 import java.io.File; 4 import java.io.IOException; 5 6 import org.apache.commons.io.FileUtils; 7 import org.apache.struts2.ServletActionContext; 8 9 import com.opensymphony.xwork2.ActionSupport; 10 11 public class UploadAction extends ActionSupport { 12 //<s:file label="上传文件:" name="upload"></s:file> 13 private File upload;//命名应该和上传页面name属性值保持一致 14 private String uploadContentType;//属性值+ContentType 15 private String uploadFileName;//属性值+FielName 16 17 public void setUpload(File upload) { 18 this.upload = upload; 19 } 20 21 public void setUploadContentType(String uploadContentType) { 22 this.uploadContentType = uploadContentType; 23 } 24 25 public void setUploadFileName(String uploadFileName) { 26 this.uploadFileName = uploadFileName; 27 } 28 29 public String upload() { 30 File destFile = new File(ServletActionContext.getServletContext() 31 .getRealPath("/uploads") 32 + "/" + uploadFileName); 33 try { 34 //工具类 35 FileUtils.copyFile(upload, destFile); 36 } catch (IOException e) { 37 e.printStackTrace(); 38 } 39 return SUCCESS; 40 } 41 }
struts.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 4 "http://struts.apache.org/dtds/struts-2.0.dtd"> 5 <struts> 6 <constant name="struts.devMode" value="true" /> 7 <!-- 全局国际化配置 --> 8 <constant name="struts.custom.i18n.resources" value="messages"></constant> 9 10 <package name="struts2test" extends="struts-default"> 11 <action name="upload" class="com.lcw.struts2.upload.UploadAction" method="upload"> 12 <result name="success">/index.jsp</result> 13 <result name="input">/upload.jsp</result> 14 </action> 15 </package> 16 17 </struts>
看下效果:
到这里基本的上传操做已经完成了,下面来下关于上传文件的配置参数:
首先咱们打开Struts2的核心包文件:
在这个文件里,咱们能够找到一些关于Struts2的常量和默认参数设置
其中咱们能够看到2个参数:
①struts.multipart.saveDir --默认的上传路径
②struts.multipart.maxSize=2097152 --默认上传文件的大小
若咱们想改变参数设置,咱们能够在struts.xml里配置,例如改变上传文件大小限定..于此类推(这里改变的是全局设定)
1 <constant name="struts.multipart.maxSize" value="200000"></constant>
若咱们想对单独的表单作设定,struts2的拦截器FileUpload有3个属性能够供咱们选择
①fileUpload.maximumSize: 上传文件的最大长度(以字节为单位), 默认值为 2 MB
②fileUpload.allowedTypes: 容许上传文件的类型, 各种型之间以逗号分隔
③fileUpload.allowedExtensions: 容许上传文件扩展名, 各扩展名之间以逗号分隔
关于参数,咱们能够打开struts2的核心包里的struts-default.xml进行查看
咱们能够发现fielUpload拦截器处于Struts2默认的拦截栈里,而且能够发现这个拦截栈引用了workflow,调用Action的validate方法,一旦有错误返回,从新定位到INPUT页面
例如:咱们保持以上上传代码不变,在配置文件的Actin里添加:
1 <interceptor-ref name="defaultStack"> 2 <param name="fileUpload.allowedExtensions">.txt</param> 3 </interceptor-ref>
设置容许上传文件类型为txt,此时来看看效果:
很明显,上传失败了,也就意味咱们的配置文件限制起做用了。
那么关于错误信息的回显
一、 若咱们是针对常量作设置,出错则跳转input 视图, 经过 <s:actionError /> 回显错误信息
二、若咱们是对fileLoad作设置,出错则在页面经过 <s:fieldError /> 回显错误信息
例如上面出现的回显错误信息File extension not allowed,咱们能够在struts2的核心jar的struts-messages.properties里找到
其中的{0}{1}{2}{3}参数分别表明upload,"C和C++程序员的Lua快速入门.pdf" ,"upload__689312be_147f80f105d__8000_00000005.tmp" ,application/pdf
咱们能够来个国际化覆盖对应的key值,进行咱们想要的回显信息:
我上传一个word文件,看下此时的页面效果:
搞定搞定,写博客仍是蛮累的。。。关于Struts2的多文件上传请戳这里:http://www.cnblogs.com/lichenwei/p/3928200.html