11.2 多个文件上传
很多应用都要求在一个界面中可以上传多个文件,Struts 2框架也可以方便地支持多个文件同时上传,一般可以使用数组和List来实现。
11.2.1 使用数组上传多个文件
(1)修改前面的upload.jsp文件,如代码11.5所示。
代码11.5 使用数组实现多个文件上传的JSP
<%
@ page
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<% @ taglib prefix="s" uri="/struts-tags" %>
< html >
< head >
< title > 使用数组实现多个文件上传 </ title >
</ head >
< body >
< s:form action ="doMultipleUploadUsingArray" method ="POST" enctype ="multipart/form-data" >
< s:file label ="文件1" name ="upload" />
< s:file label ="文件2" name ="upload" />
< s:file label ="文件3" name ="upload" />
< s:submit value ="上传" />
</ s:form >
</ body >
</ html >
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<% @ taglib prefix="s" uri="/struts-tags" %>
< html >
< head >
< title > 使用数组实现多个文件上传 </ title >
</ head >
< body >
< s:form action ="doMultipleUploadUsingArray" method ="POST" enctype ="multipart/form-data" >
< s:file label ="文件1" name ="upload" />
< s:file label ="文件2" name ="upload" />
< s:file label ="文件3" name ="upload" />
< s:submit value ="上传" />
</ s:form >
</ body >
</ html >
(2)在该form中,定义了3个具有相同名称的文件域,所以需要在Action实现类中使用数组来封装这3个文件域。使用数组多个上传文件的业务控制器如代码11.6所示。
代码11.6 使用数组上传多个文件的业务控制器
package
ch11;
import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class MultipleFileUploadUsingArrayAction extends ActionSupport {
private File[] uploads;
private String[] uploadFileNames;
private String[] uploadContentTypes;
private String[] dir;
private String[] targetFileName;
//属性的getter和setter方法
public File[] getUpload() {
return this.uploads;
}
public void setUpload(File[] upload) {
this.uploads = upload;
}
public String[] getUploadFileName() {
return this.uploadFileNames;
}
public void setUploadFileName(String[] uploadFileName) {
this.uploadFileNames = uploadFileName;
}
public String[] getUploadContentType() {
return this.uploadContentTypes;
}
public void setUploadContentType(String[] uploadContentType) {
this.uploadContentTypes = uploadContentType;
}
//文件上传
public String upload() throws Exception {
// 获得upload路径的实际目录
String realPath = ServletActionContext.getRequest().getRealPath(
"/upload");
//获得实际目录
String targetDirectory = realPath;
String[] mydir = new String[uploads.length];
String[] tname = new String[uploads.length];
for (int i = 0; i < uploads.length; i++) {
// 生成保存文件的文件名称
tname[i] = generateFileName(uploadFileNames[i]);
// 保存文件的路径
mydir[i] = targetDirectory + "\" + tname[i];
// 建立一个目标文件
File target = new File(targetDirectory, tname[i]);
// 将临时文件复制到目标文件
FileUtils.copyFile(uploads[i], target);
}
setDir(mydir);
setTargetFileName(tname);
return SUCCESS;
}
// 为上传文件自动分配文件名称,避免重复
private String generateFileName(String fileName) {
// 获得当前时间
DateFormat format = new SimpleDateFormat("yyMMddHHmmss");
// 转换为字符串
String formatDate = format.format(new Date());
// 随机生成文件编号
int random = new Random().nextInt(10000);
// 获得文件后缀名称
int position = fileName.lastIndexOf(".");
String extension = fileName.substring(position);
// 组成一个新的文件名称
return formatDate + random + extension;
}
//属性的getter和setter方法
public String[] getDir() {
return dir;
}
public void setDir(String[] dir) {
this.dir = dir;
}
public String[] getTargetFileName() {
return targetFileName;
}
public void setTargetFileName(String[] targetFileName) {
this.targetFileName = targetFileName;
}
}
import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class MultipleFileUploadUsingArrayAction extends ActionSupport {
private File[] uploads;
private String[] uploadFileNames;
private String[] uploadContentTypes;
private String[] dir;
private String[] targetFileName;
//属性的getter和setter方法
public File[] getUpload() {
return this.uploads;
}
public void setUpload(File[] upload) {
this.uploads = upload;
}
public String[] getUploadFileName() {
return this.uploadFileNames;
}
public void setUploadFileName(String[] uploadFileName) {
this.uploadFileNames = uploadFileName;
}
public String[] getUploadContentType() {
return this.uploadContentTypes;
}
public void setUploadContentType(String[] uploadContentType) {
this.uploadContentTypes = uploadContentType;
}
//文件上传
public String upload() throws Exception {
// 获得upload路径的实际目录
String realPath = ServletActionContext.getRequest().getRealPath(
"/upload");
//获得实际目录
String targetDirectory = realPath;
String[] mydir = new String[uploads.length];
String[] tname = new String[uploads.length];
for (int i = 0; i < uploads.length; i++) {
// 生成保存文件的文件名称
tname[i] = generateFileName(uploadFileNames[i]);
// 保存文件的路径
mydir[i] = targetDirectory + "\" + tname[i];
// 建立一个目标文件
File target = new File(targetDirectory, tname[i]);
// 将临时文件复制到目标文件
FileUtils.copyFile(uploads[i], target);
}
setDir(mydir);
setTargetFileName(tname);
return SUCCESS;
}
// 为上传文件自动分配文件名称,避免重复
private String generateFileName(String fileName) {
// 获得当前时间
DateFormat format = new SimpleDateFormat("yyMMddHHmmss");
// 转换为字符串
String formatDate = format.format(new Date());
// 随机生成文件编号
int random = new Random().nextInt(10000);
// 获得文件后缀名称
int position = fileName.lastIndexOf(".");
String extension = fileName.substring(position);
// 组成一个新的文件名称
return formatDate + random + extension;
}
//属性的getter和setter方法
public String[] getDir() {
return dir;
}
public void setDir(String[] dir) {
this.dir = dir;
}
public String[] getTargetFileName() {
return targetFileName;
}
public void setTargetFileName(String[] targetFileName) {
this.targetFileName = targetFileName;
}
}
★ 说明 ★
使用数组上传多个文件同上传单个文件非常类似,并不复杂。