文件上传几乎是所有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同方法一。
两种方法实现的页面:略......