文件上传几乎是所有web应用实现的一个必须模块。文件上传的实现需要将表单元素属性enctype的值设置为multipart/form-data,使表单数据以二进制编码方式提交。
struts2对文件上传的支持: struts2文件上传需要commons-fileupload-x.x.x.jar和commons-io-x.x.x.jar两个包。
文件上传方法一:
所有action的父类:BaseAction.java:
package com.web.action; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.interceptor.ApplicationAware; import org.apache.struts2.interceptor.ServletRequestAware; import org.apache.struts2.interceptor.ServletResponseAware; import org.apache.struts2.interceptor.SessionAware; import com.opensymphony.xwork2.ActionSupport; //所有action的父类 @SuppressWarnings("serial") public class BaseAction extends ActionSupport implements ServletRequestAware,ServletResponseAware,SessionAware,ApplicationAware{ HttpServletRequest request; HttpServletResponse response; Map<String, Object> session; Map<String, Object> application; public void setApplication(Map<String, Object> arg0) { this.application=arg0; } public void setSession(Map<String, Object> arg0) { this.session=arg0; } public void setServletResponse(HttpServletResponse arg0) { this.response=arg0; } public void setServletRequest(HttpServletRequest arg0) { this.request=arg0; } } 文件上传页面:index.jsp: <h2>单文件上传示例一</h2> <s:form action="OneFileUploadAction!uploadFile.action" method="post" enctype="multipart/form-data"> <s:textfield name="userInfo.uname" label="姓名"></s:textfield> <s:file name="upload" label="照片"></s:file> <s:textfield name="userInfo.age" label="年龄"></s:textfield> <s:radio list="#{1:'男',2:'女'}" name="userInfo.sex" label="性别" value="1"></s:radio> <s:submit value="提交"></s:submit> </s:form>文件上传的action:OneFileUploadAction.java: package com.web.action; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import com.web.entity.UserInfo; //单文件上传使用的action //使用老方法 @SuppressWarnings("serial") public class OneFileUploadAction extends BaseAction{ private File upload; //封装上传文件域的属性 private String uploadContentType; //封装上传文件的类型 private String uploadFileName; //封装上传文件的名称 private UserInfo userInfo; //创建UserInfo的对象userInfo //set and get 方法省略 public String uploadFile(){ try { //获取文件上传的完整路径 String path=request.getSession().getServletContext().getRealPath("/")+"upload/"+uploadFileName; //创建输出流,接收从输入流转过来的文件并存到制定的文件路径下 FileOutputStream out=new FileOutputStream(path); //创建输入流,接收页面传过来的file文件 FileInputStream in=new FileInputStream(upload); //创建缓冲区 byte[] b=new byte[1024*1024*10]; //存放缓冲区长度 int len=0; while((len=in.read(b))!=-1){ //循环将输入流中的内容写到输出流 out.write(b, 0, len); } //关闭输入输出流 in.close(); out.close(); userInfo.setPhoto("upload/"+uploadFileName); return SUCCESS; } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }实体类:UserInfo.java: package com.web.entity; public class UserInfo { private String uname; private String photo; private int age; private int sex; public UserInfo() { super(); // TODO Auto-generated constructor stub } public UserInfo(String uname, String photo, int age, int sex) { super(); this.uname = uname; this.photo = photo; this.age = age; this.sex = sex; } //set and get 方法省略 } struts.xml配置文件: <struts> <constant name="struts.devMode" value="true"></constant> <!-- 配置包元素 --> <package name="default" extends="struts-default" namespace="/"> <action name="OneFileUploadAction" class="com.web.action.OneFileUploadAction"> <result name="success">/success.jsp</result> <result name="input">/index.jsp</result> </action> </package> </struts>成功显示页面:success.jsp: <body> <h2>注册成功显示用户信息</h2> 姓名:<s:property value="userInfo.uname"/> 年龄:<s:property value="userInfo.age"/> 性别:<s:if test="userInfo.sex"> 男 </s:if> <s:else> 女 </s:else> 头像:<img src="upload/<s:property value="uploadFileName"/>" alt="暂无图片" width="50px" height="50px" /> </body>
文件上传方法二:
文件上传的action:OneFileUploadAction1.java :
package com.web.action; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.apache.struts2.ServletActionContext; import com.web.entity.UserInfo; //新方法单文件上传 @SuppressWarnings("serial") public class OneFileUploadAction1 extends BaseAction{ private static final int BUFFER_SIZE=40*40; private File upload; //封装上传文件域的属性 private String uploadContentType; //封装文件上传的类型 private String uploadFileName; //封装上传文件名 private String savePath; //封装上传文件的保存路径 private UserInfo userInfo; //创建UserInfo的对象userInfo //set and get方法省略....... //将源文件复制成目标文件 private static void copy(File source,File target){ InputStream in=null; //声明一个输入流 OutputStream out=null;//声明一个输出流 try { //实例化输入流 in=new BufferedInputStream(new FileInputStream(source), BUFFER_SIZE); //实例化输出流 out=new BufferedOutputStream(new FileOutputStream(target), BUFFER_SIZE); //定义字节数组buffer,作为缓冲区 byte[] buffer=new byte[BUFFER_SIZE]; //定义临时参数对象 int len=0; while((len=in.read(buffer))>0){ //如果上传文件字节数大于0 //将内容以字节形式写入 out.write(buffer, 0, len); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { //先检测输入流关了没有,如果没关,先关闭输入流 if(in!=null){ try { in.close(); } catch (IOException e) { System.out.println("关闭输入流失败!"); e.printStackTrace(); } } //再检测输出流关闭没有,如果没关闭,就关闭输出流 if(out!=null){ try { out.close(); } catch (IOException e) { System.out.println("关闭输出流失败!"); e.printStackTrace(); } } } } public String uploadFile(){ //根据服务器的文件保存地址和源文件名创建目录文件全路径 String path=request.getSession().getServletContext().getRealPath("/")+"upload/"+uploadFileName; //将上传的文件名称赋值给userInfo对象的photo属性 userInfo.setPhoto(this.getUploadFileName()); //定义目标文件对象 File target=new File(path); //调用copy方法实现文件写入 copy(this.upload, target); return SUCCESS; } }配置文件:struts.xml(本配置文件实现了上传文件的过滤,比如:过滤上传文件的格式、上传文件的大小等): <struts> <constant name="struts.devMode" value="false"></constant> <!-- 配置包元素 --> <package name="default" extends="struts-default" namespace="/"> <action name="OneFileUploadAction" class="com.web.action.OneFileUploadAction1"> <!-- 使用fileUpload拦截器 --> <interceptor-ref name="fileUpload"> <!-- 显示上传文件的文件类型只能为图片 --> <param name="allowedTypes">image/pjpeg,image/x-jpeg,image/gif,image/bmp,image/jpeg</param> <!-- 制定允许上传文件的大小 --> <param name="maximumSize">1024*1024*10</param> </interceptor-ref> <!-- 配置默认系统拦截器 --> <interceptor-ref name="defaultStack"></interceptor-ref> <param name="savePath">/upload</param> <result name="success">/success.jsp</result> <result name="input">/index.jsp</result> </action> </package> </struts>
实体类文件UserInfo.java,配置文件web.xml、上传页面index.jsp、成功显示页面success.jsp、所有action的父类BaseAction.java同方法一。 两种方法实现的页面:略......
