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>
<h1>文件上传</h1>
<form action="user_register" method="post" enctype="multipart/form-data">
帐号<input type="text" name="username"><br/>
文件<input type="file" name="attachment"><br/>
附件1:<input type="file" name="attach"><br/>
附件2:<input type="file" name="attach"><br/>
附件3:<input type="file" name="attach"><br/>
<input type="submit" value="提交">
</form>
<s:debug/>
</body>
</html>
Action
需要一个File类型的属性(File的List和数组也可以,支持批量上传),这些File属性指的是上传的临时文件,我们要编程处理这些临时文件。
String类型的属性可以用来获取客户端真是的文件名称(命名规则:参数名+FileName)
package com.zucc.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletContext;
import org.apache.struts2.util.ServletContextAware;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport implements ServletContextAware {
/**
*
*/
private static final long serialVersionUID = 1L;
private String username;
// 上传到服务器的临时文件
private File attachment;
// 上传的文件的MIME类型
private String attachmentContenType;
// 上传的文件的客户端的名称
private String attachmentFileName;
private ServletContext application;
// 时间转换
private DateFormat df;
// 保存路径
private String saveDir;
private File[] attach;
private String[] attachFileName;
public UserAction() {
this.df = new SimpleDateFormat("yyyyMMdd_HHmmssSS_");
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public File getAttachment() {
return attachment;
}
public void setAttachment(File attachment) {
this.attachment = attachment;
}
public String getAttachmentContenType() {
return attachmentContenType;
}
public void setAttachmentContenType(String attachmentContenType) {
this.attachmentContenType = attachmentContenType;
}
public String getAttachmentFileName() {
return attachmentFileName;
}
public void setAttachmentFileName(String attachmentFileName) {
this.attachmentFileName = attachmentFileName;
}
public ServletContext getApplication() {
return application;
}
public void setApplication(ServletContext application) {
this.application = application;
}
public File[] getAttach() {
return attach;
}
public void setAttach(File[] attach) {
this.attach = attach;
}
public String[] getAttachFileName() {
return attachFileName;
}
public void setAttachFileName(String[] attachFileName) {
this.attachFileName = attachFileName;
}
@Override
public void setServletContext(ServletContext context) {
this.application = context;
// 文件上传到<webAppPath>/upload/
/**
* 初始化文件上传的路径
*/
saveDir = application.getRealPath("/upload");
System.out.println("saveDir:" + saveDir);
File saveDirFile = new File(saveDir);
if (!saveDirFile.exists()) {
saveDirFile.mkdir();
}
}
public String register() throws Exception {
System.out.println("UserAction register....");
System.out.println("USername:" + username);
System.out.println("attachment:" + attachment);
System.out.println("attachmentContenType:" + attachmentContenType);
System.out.println("attachmentFileName:" + attachmentFileName);
if (attachment != null) {
// 单个文件上传
this.saveFile(attachment, this.getExtension(attachmentFileName));
}
if (attach != null) {
// 文件批量上传
for (int i = 0; i < attach.length; i++) {
System.out.println("attach[" + i + "]:" + attach[i]);
System.out.println("attachFilename[" + i + "]:"
+ attachFileName[i]);
this.saveFile(attach[i], this.getExtension(attachFileName[i]));
}
}
return SUCCESS;
}
/**
* 保存文件
*
* @param file
* @param extension
* @throws IOException
*/
private void saveFile(File file, String extension) throws IOException {
Date date = new Date();
int randNum = (int) (Math.random() * 9000 + 1000);
String saveFileName = df.format(date) + randNum + "." + extension;
System.out.println("saveFileName:" + saveFileName);
// 文件拷贝
FileInputStream fis = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(saveDir + "/"
+ saveFileName);
byte[] data = new byte[1024 * 20];
int len = fis.read(data);
while (len != -1) {
fos.write(data, 0, len);
len = fis.read(data);
}
fis.close();
fos.close();
}
/**
* 获取上传文件的扩展名
*
* @param attachmentFileName
* @return
*/
private String getExtension(String filename) {
String extension = null;
// 保存的文件名按照时间进行命名:年月日_时分秒毫秒_随机数
int lastDotIndex = filename.lastIndexOf('.');
if (lastDotIndex == -1) {
extension = "";
} else {
extension = filename.substring(lastDotIndex + 1);
}
System.out.println("extension:" + extension);
return extension;
}
}
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>
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<constant name="struts.devMode" value="true" />
<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
<!-- 本次上传的所有文件的总大小的设置,value为1024*1024*x,x为MB大小,,value不能是表达式 -->
<constant name="struts.multipart.maxSize" value="2097152"/>
<package name="default" namespace="/" extends="struts-default">
<action name="user_*" class="com.zucc.action.UserAction" method="{1}">
<result>/NewFile.jsp</result>
<result name="input">/NewFile.jsp</result>
<interceptor-ref name="fileUpload">
<!-- 对单个文件的大小的设置,值为1024*1024*x,x为MB大小 -->
<param name="maximumSize">2097152</param>
<!-- 对单个文件的后缀名进行设置,这里只能上传.jpg和.gif格式的文件,两个后缀名用,隔开,不区分大小写 -->
<param name="allowedExtensions">.jpg,.gif</param>
</interceptor-ref>
<interceptor-ref name="basicStack"/>
</action>
</package>
</struts>
注意:当上传的文件超过最大值时(最大值为struts2-core-2.3.28.1.jar的org.apache.struts2的default.properties的struts.multipart.maxSize所等于的值,可以在struts.xml中进行配置),会跳转到result为input所指示的页面,没有的话会报错,可以在struts.xml中设置(<result name="input">/</result>)