先来一个表单
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/upload" method=post enctype="multipart/form-data">
姓名:<input type="text" name="name"> <br/>
年龄:<input type="text" name="age"> <br/>
头像:<input type="file" name="upload"> <br/>
<input type="submit" value="提交">
</form>
</body>
</html>
编写javaBean
package blog.csdn.net.domain;
public class User {
private String name;
private Integer age;
private String image;
//get set方法...
}
编写文件上传Action
package blog.csdn.net.web.action;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import blog.csdn.net.domain.User;
import blog.csdn.net.utils.UploadUtils;
public class UploadAction extends ActionSupport implements ModelDriven<User> {
private static final long serialVersionUID = 1L;
//模型驱动注入值
private User user = new User();
@Override
public User getModel() {
return user;
}
/**
* 通过属性驱动注入3个值
* 文件上传相关的3个属性 ,struts2会自动注入
* 上传的文件 : 属性名与表单中file的name属性名一致
* 上传的文件名:属性名前段是name属性名一致+FileName;
* 上传的文件类型: 属性名前段是name属性名一致 + ContentType;
*/
private File upload; // 表单的name是upload
private String uploadFileName; // 文件名
private String uploadContentType;// 文件类型
public void setUpload(File upload) {
this.upload = upload;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
public String upload() throws IOException {
if (null != this.uploadFileName) {
// 说明有文件需要上传
String filename = UploadUtils.getUUIDName(this.uploadFileName);
// 保存到tomcat目录下
String uploadDidr = "E:\\apache-tomcat-7.0.52\\webapps\\upload";
// 保存上传的文件,通过apache提供的工具类来操作
FileUtils.copyFile(upload, new File(uploadDidr, filename));
//保存文件到User中,只保存相对路径,外部访问的时候可以拼上tomcat服务器的地址
user.setImage("/upload/"+filename);
}
//下面的操作就是调业务层的代码将user的数据进行保存,例如userService.save(user);
//我这里没有集成hibernate,所以就直接通过控制台来查看了
System.out.println(user);
//回写结果
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/html;charset=utf-8");
response.getWriter().print("提交成功!!");
return NONE;
}
}
配置struts.xml 配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="*" class="blog.youkuaiyun.com.web.action.UploadAction" method="{1}"/>
</package>
</struts>
UploadUtils工具类
package blog.csdn.net.utils;
import java.util.UUID;
/**
* 文件上传的工具类
*/
public class UploadUtils {
/**
* 传入文件的名称,返回的唯一的名称
* 例如:gril.jpg 返回sdjsljfsjdl.jpg
* @param filename
* @return
*/
public static String getUUIDName(String filename){
// 先查找
int index = filename.lastIndexOf(".");
// 截取
String lastname = filename.substring(index, filename.length());
// 唯一 字符串 fsd-sfsdf-sfsd-sdfsd
String uuid = UUID.randomUUID().toString().replace("-", "");
return uuid+lastname;
}
}
ok,可以测试了。
提交后,看到
控制台输出结果:
查看tomcat下upload目录的结果:
然后就可以拼接图片的路径来访问上传的内容啦,例如http://192.168.30.217:8080/upload/e359f3f4b7b94e42946c18fe73e01b1a.png
配置文件上传的大小和上传类型
默认情况下,Struts2单个文件上传大小限制是2M,超出后会报下面这个错误
对于这个没有找到定义在UploadAction下的result里的input返回结果, 我们可以配置一下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="*" class="blog.youkuaiyun.com.web.action.UploadAction" method="{1}">
<!-- 配置input结果错误的页面 -->
<result name="input" type="redirect">/msg.jsp</result>
</action>
</package>
</struts>
指定跳去的页面是:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>异常</title>
</head>
<body>
<h1>服务器异常</h1>
文件上传超出最大限制
</body>
</html>
然后,再次上传一个超过2M的文件,看到的页面就是我们指定跳转的页面了.
除了解决input异常的错误页面,我们还可以修改Struts2的单个文件上传的大小,只需要在struts.xml中加一条常量配置
<!-- 设置上传文件的总大小,默认是2M struts.multipart.maxSize=2097152,现在修改成最大20M -->
<constant name="struts.multipart.maxSize" value="20971520"/>
关于如何查看有那些常量可以使用,可以查看struts2核心包中的这个文件
另外,如果要限制文件的上传类型的话,只需要给文件上传拦截器org.apache.struts2.interceptor.FileUploadInterceptor的allowedExtensions属性添加类型约束即可.该拦截器定义在defaultStack默认的拦截器栈中,也就这个:
对应的class
这些声明都是定义在Struts2的核心jar包的struts-default.xml中
ok,扯了那么多,回归都操作上就是在指定的Action中加入这几行代码
<!-- 引入默认的拦截器 -->
<interceptor-ref name="defaultStack">
<!-- 决定上传文件的类型,多个类型用,号分开 -->
<param name="fileUpload.allowedExtensions">.jpg,.png</param>
</interceptor-ref>
完整的struts.xml文件配置如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 设置上传文件的总大小,默认是2M struts.multipart.maxSize=2097152,现在修改成最大20M -->
<constant name="struts.multipart.maxSize" value="20971520"/>
<package name="default" namespace="/" extends="struts-default">
<action name="*" class="blog.youkuaiyun.com.web.action.UploadAction" method="{1}">
<!-- 配置input结果错误的页面 -->
<result name="input" type="redirect">/msg.jsp</result>
<!-- 引入默认的拦截器 -->
<interceptor-ref name="defaultStack">
<!-- 决定上传文件的类型,参数name=拦截器名.属性名 -->
<param name="fileUpload.allowedExtensions">.jpg,.png</param>
</interceptor-ref>
</action>
</package>
</struts>