在注册某个网站或者包名某个考试的时候通常都会让我们上传照片或者简历等文件。这里记录一下struts2文件上传的用法。
struts2文件上传基于拦截器实现,使用的是struts内置的拦截器。打开struts系统拦截器定义文件,可以看到里面有个fileUpload拦截器,struts2上传文件使用的就是这个拦截器:
现在通过工程示例看一下上传文件的用法。
1.新建工程SecondLearnStruts2Chap08;
2.新建一个负责上传文件的jsp页面:fileupload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!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>Insert title here</title>
</head>
<body>
<form action="upload" method="post" enctype="multipart/form-data">
文件:<input type="file" name="filetest"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
这里定了一个form表单,这里要上传文件的话要配置enctype="multipart/form-data"这个属性,这样的话上传的文件就会以二进制方式上传。选择文件的input标签使用type="file"属性,这就是我们平时常见的一个文件选择按钮的样式。重点注意name属性,这里要在后面的处理类中用到。
3.新建action处理类:FileUpladAction:
package com.test.action;
import java.io.File;
import org.apache.commons.io.FileUtils;
import com.opensymphony.xwork2.ActionSupport;
public class FileUpladAction extends ActionSupport{
/**
*
*/
private static final long serialVersionUID = 1L;
private File filetest;//文件
private String filetestFileName;//文件名
private String filetestContentType;//文件类型
public File getFiletest() {
return filetest;
}
public void setFiletest(File filetest) {
this.filetest = filetest;
}
public String getFiletestFileName() {
return filetestFileName;
}
public void setFiletestFileName(String filetestFileName) {
this.filetestFileName = filetestFileName;
}
public String getFiletestContentType() {
return filetestContentType;
}
public void setFiletestContentType(String filetestContentType) {
this.filetestContentType = filetestContentType;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println("文件名:"+filetestFileName);
System.out.println("文件类型:"+filetestContentType);
String filePath = "C:/"+filetestFileName;
File saveFile = new File(filePath);
FileUtils.copyFile(filetest, saveFile);//把上传的文件搞到本地去,上传的文件是存储在缓存中的
return SUCCESS;
}
}
这里定义了文件、文件名、文件类型三个变量,并分别定义了他们的get和set方法。当跳转到处理类的时候,struts2会自动把上传的文件信息赋值给处理类中相应的变量。
这里重点要注意,文件变量、文件名变量、文件类型变量这三个变量的命名有一定的规则要求:
Struts2 获取上传文件的变量名:name (name 是文件表单的name属性值,这里是filetest)
Struts2 获取上传文件名的变量名:name+FileName(这里是filetestFileName);
Struts2 获取上传文件的类型的变量名:name+ContentType(这里是filetestContentType);
按照上述命名规则定义变量,struts2会自动把上传的文件信息分别赋值给这三个变量。execute函数中输出上传文件的信息,并把上传文件保存到C盘中。
4.配置文件struts.xml
<struts>
<package name="manager" extends="struts-default">
<action name="upload" class="com.test.action.FileUpladAction">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
5.success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!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>Insert title here</title>
</head>
<body>
文件上传成功!
</body>
</html>
6.运行程序:
点击选择文件按钮,并选择一个文件:
这里选择美女1号.jpg文件,并点击上传按钮,会看到文件跳转到success.jsp文件,文件上传成功,C盘中出现了这个文件。
struts2默认上传文件的最大为2M。我们在注册某个网站的时候,经常会遇到要求我们上传的照片大小不能大于100K或者其它。现在看一下如何设置上传文件的大小以及设置上传文件的类型。
1.这里要重新配置工程文件struts.xml
<struts>
<package name="manager" extends="struts-default">
<action name="upload" class="com.test.action.FileUpladAction">
<result name="success">/success.jsp</result>
<result name="input">/fileupload.jsp</result>
<interceptor-ref name="fileUpload">
<param name="allowedTypes">image/bmp,image/x-png,image/gif,image/jpg,image/jpeg</param>
<param name="maximumSize">81101</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
</struts>
设置文件的大小以及类型需要使用<param标签>,这里就需要在action中重新引入fileUpload拦截器并配置好这两个属性,这里设置上传文件的大小不能大于81K。按照前面讲到的拦截器知识(当action中指定了拦截器的话,action中的请求就会只使用指定的拦截器而不会使用工程默认的拦截器了),要想使用其他拦截器功能的话就需要重新引入默认的defaultStack拦截器栈。
如果我们上传的文件大于80k或者上传的文件不是我们指定的类型的话,就会返回input,当返回input时停留在fileupload.jsp页面。
2.修改fileupload.jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!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>Insert title here</title>
</head>
<body>
<s:fielderror></s:fielderror>
<form action="upload" method="post" enctype="multipart/form-data">
文件:<input type="file" name="filetest"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
这里只是添加了一个<s:fielderror></s:fielderror>标签,上传文件失败返回的错误信息会显示在这个标签中。
3.运行程序,选择美女1号.jpg上传发现是能够上传成功的。但是选择美女2号.jpg(150K),发现提示了如下错误:
这里提示我们上传的文件太大了。
上面讲到了struts2默认上传文件的大小是2M,现在验证一下。
1.修改struts.xml文件:
<struts>
<package name="manager" extends="struts-default">
<action name="upload" class="com.test.action.FileUpladAction">
<result name="success">/success.jsp</result>
<result name="input">/fileupload.jsp</result>
</action>
</package>
</struts>
这里没有指定要上传的文件和大小,使用默认的配置。
2.运行程序,上传美女2号.jpg文件发现上传成功,上传“三毛扮演者演员调戏美女遭毒打.flv”失败,程序提示错误信息为:
这里提示上传的文件太大,超过了默认的2M大小值。
当需要上传大于2M的文件时,需要修改struts的配置文件,对允许上传文件的最大值进行设置。
1.修改struts.xml文件:
<struts>
<constant name="struts.multipart.maxSize" value="20000000"></constant>
<package name="manager" extends="struts-default">
<action name="upload" class="com.test.action.FileUpladAction">
<result name="success">/success.jsp</result>
<result name="input">/fileupload.jsp</result>
</action>
</package>
</struts>
这里使用<constant>标签配置允许上传文件的大小,这里设置了上传文件最大为20M。
2.运行程序,上传文件“三毛扮演者演员调戏美女遭毒打.flv”,文件上传成功。