很多应用都要求在一个界面中可以上传多个文件,Struts 2框架也可以方便地支持多个文件同时上传,一般可以使用数组和List来实现。
使用数组实现上传多个文件:
(1)upload.jsp文件,代码11.5所示。
<%@ 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>
(2)在该form中,定义了3个具有相同名称的文件域,所以需要在Action实现类中使用数组来封装这3个文件域。使用数组多个上传文件的业务控制器如代码
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;
}
}
使用数组上传多个文件同上传单个文件非常类似,并不复杂。
(3)在配置文件中增加如下配置:
<action name="doMultipleUploadUsingArray"
class="ch11.MultipleFileUploadUsingArrayAction"
method="upload">
<result>/ch11/multipleUploadUsingArray-success.jsp</result>
<result name="input">/ch11/multipleUploadUsingArray.jsp</result>
</action>
(4)multipleUploadUsingArray-success.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>
<table border="1">
<!-- 使用迭代标签-->
<s:iterator value="dir" status="stat">
<tr>
<td>文件名称<s:property value="%{#stat.index}" /></td>
<td><s:property value="%{dir[#stat.index]}" /></td>
</tr>
</s:iterator>
</table>
<table border="1">
<!-- 使用迭代标签-->
<s:iterator value="uploadContentType" status="stat">
<tr>
<td>文件类型<s:property value="%{#stat.index}" /></td>
<td><s:property value="%{uploadContentType[#stat.index]}" /></td>
</tr>
</s:iterator>
</table>
<table border="1">
<!-- 使用迭代标签-->
<s:iterator value="+targetFileName" status="stat">
<tr>
<td>图片<s:property value="%{#stat.index}" /></td>
<td><img src="<s:property value="'/bookcode/upload/'+targetFileName[#stat.index]"/>"/></td>
</tr>
</s:iterator>
</table>
</body>
</html>
运行该示例,在浏览器中输入http://localhost:8080/TestS/multipleUpload UsingArray.jsp,界面如图
(6)在这里,选择3个gif文件,单击“上传”按钮,结果如图
使用List上传多个文件:
使用List来上传多个文件同数组基本相同,上传JSP文件和success逻辑视图的JSP文件均不用修改,只是需要相应的Action实现类即可。
分享到:
相关推荐
Struts2多文件上传是Java Web开发中常见的一项功能,用于允许用户一次上传多个文件。在Struts2框架中,实现这一功能涉及到一系列的技术和步骤。以下是对这一知识点的详细说明: 1. **Struts2框架**:Struts2是一个...
总结来说,Struts2多文件上传涉及到Struts2配置、Action编写、HTML表单设计以及结果处理等多个环节。通过以上步骤,你可以在Struts2应用中实现稳定可靠的多文件上传功能。不过,实际项目中还需要考虑错误处理、安全...
Struts2是一个非常流行的Java Web框架,...总的来说,Struts2多文件上传并显示进度的实现需要结合前端和后端的技术,通过AJAX和XMLHttpRequest的`onprogress`事件来动态更新进度条,同时确保后端处理的高效和安全性。
在Struts2中,文件上传功能是一个常用特性,尤其在处理用户提交的多个文件时。本文将详细讲解如何使用Struts2进行多个文件的上传,重点是使用List集合进行上传。 首先,要实现Struts2的文件上传,必须引入必要的...
在实际项目中,文件上传和下载功能是必不可少的,本实例将详细讲解如何在Struts2框架下实现单个文件及多个文件的上传与下载。 首先,我们需要在Struts2的配置文件(struts.xml)中添加相关的Action配置,以便处理文件...
在Struts2中,文件上传和下载是常见的功能,对于用户交互和数据交换至关重要。这篇内容将深入讲解如何在Struts2中实现多文件的上传和下载。 1. **文件上传** 文件上传在Web应用中常常用于让用户提交各种类型的文件...
文件上传比较多,多文件上传少一点 文件下载很少的,看似简单,实则不然 网上的Struts2进行的文件下载一般都是单文件或者固定的文件,并没有(很少)实现随意文件的下载的例子 提供多文件上传,上传成功后,提供...
通过以上步骤,我们可以利用ExtJS的用户界面和Struts2的后台处理能力,实现一个完整的多文件上传功能。这个功能不仅提高了用户体验,还简化了开发流程。在实际项目中,还可以进一步优化,例如添加进度条显示、预览...
Struts2提供了完善的文件上传支持,让我们来详细探讨如何在Struts2中实现多文件上传。 首先,我们需要在Struts2的配置文件(struts.xml)中启用文件上传的支持。这通常涉及到添加`<constant>`标签来设置`struts....
本篇文章将深入讲解如何利用AjaxFileUpload与Struts2实现多文件上传,并结合jQuery进行前端交互。 首先,我们需要在项目中引入必要的库。Struts2提供了struts2-jquery-plugin,这是一个基于jQuery的插件,包含了...