sruts2:单个文件上传,多个文件上传(属性驱动)
文件上传功能在Struts2中得到了很好的封装,主要使用fileUpload上传组件。
1. 单个文件上传
1.1 创建上传单个文件的JSP页面、显示提交结果的JSP页面
uploadTest1.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page isELIgnored="false"%>
<%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<s:form action="uploadT1" method="post" enctype="multipart/form-data">
<s:file name="uploadFile"></s:file>
<br />
<s:submit value="提交"></s:submit>
</s:form>
</body>
</html>
注意:代码中加入了enctype="multipart/form-data";而且使用了<s:file/>标签,尤其注意<s:file/>的name属性。
showResult1.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page isELIgnored="false"%>
<%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
您上传的文件名为:<s:property value="uploadFileFileName" />,存放目录:<s:property value="#request.storeDir"/>
<br />
<br/>
<!--下载上下文路径-->
<s:a href="%{#request.get('javax.servlet.forward.context_path')}/upload/%{uploadFileFileName}">点击这里下载</s:a>
<br />
</body>
</html>
1.2 生成Action类
package com.clzhang.struts2.demo12; import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport; public class UploadTest1Action extends ActionSupport {
public static final long serialVersionUID = 1; private File uploadFile;
private String uploadFileFileName; public File getUploadFile() {
return uploadFile;
}
public void setUploadFile(File uploadFile) {
this.uploadFile = uploadFile;
}
public String getUploadFileFileName() {
return uploadFileFileName;
}
public void setUploadFileFileName(String uploadFileFileName) {
this.uploadFileFileName = uploadFileFileName;
} public String execute() throws IOException {
// 上传物理路径
String targetDirectory = ServletActionContext.getServletContext().getRealPath("/upload");
// 生成上传的File对象
File target = new File(targetDirectory, uploadFileFileName);
// 复制File对象,从而实现上传文件
FileUtils.copyFile(uploadFile, target); ServletActionContext.getRequest().setAttribute("storeDir", targetDirectory); return SUCCESS;
}
}
Action实例中File变量命名规则:
- 数据类型为File的变量uploadFile和JSP页面中的<s:file/>标签的name属性值要一致,这样才可以使用Struts2的拦截器进行属性值的自动封装。
- Action实例中有uploadFileFileName变量,对应于上传文件的文件名,它的命名规则就是File的变量名后加FileName。
1.3 设置上传文件相关参数(struts.properties)
struts.multipart.maxSize=
struts.multipart.saveDir=/upload
通常此文件存放于WEB-INF\classes目录下。
1.4 修改struts.xml文件
<action name="uploadT1" class="com.clzhang.struts2.demo12.UploadTest1Action">
<result>/struts2/demo12/showResult1.jsp</result>
</action>
1.5 测试
打开IE,输入地址:http://127.0.0.1:8080/st/struts2/demo12/uploadTest1.jsp
结果如下:
选择任意一个文件提交后,结果如下:
一个,显示了服务器物理存储地址;二个,提供了下载链接。
2. 多个文件上传(属性驱动)
Struts2支持多文件批量上传,将上面的代码中的File类型改成File[]即可。
2.1 创建上传多个文件的JSP页面、显示提交结果的JSP页面
uploadTest2.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page isELIgnored="false"%>
<%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<s:form action="uploadT2" method="post" enctype="multipart/form-data">
username:<s:textfield name="fileUploadTools.username"></s:textfield>
<br />
<s:file name="fileUploadTools.uploadFile"></s:file>
<br />
<s:file name="fileUploadTools.uploadFile"></s:file>
<br />
<s:file name="fileUploadTools.uploadFile"></s:file>
<br />
<s:submit value="提交"></s:submit>
</s:form>
</body>
</html>
注意:因为是属性驱动,所以表单元素的命名需要以fileUploadTools打头。
showResult2.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page isELIgnored="false"%>
<%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
您上传的文件名列表:
<br/>
<!--对Action中对象(fileUploadTools)包含的数组(uploadFileFileName)的遍历-->
<s:iterator value="fileUploadTools.uploadFileFileName" status="st">
<s:iterator value="fileUploadTools.uploadFileFileName[#st.index]">
<s:property />
<br/>
</s:iterator>
</s:iterator>
<br />
</body>
</html>
2.2 生成Action类及属性驱动类
UploadTest2Action.java
package com.clzhang.struts2.demo12; import java.io.IOException; import com.opensymphony.xwork2.ActionSupport; public class UploadTest2Action extends ActionSupport {
public static final long serialVersionUID = 1; // 声明封装了File上传的FileUploadTools类的实例
// FileUploadTools类也封装了上传的属性及get和set方法
private FileUploadTools fileUploadTools = new FileUploadTools(); public FileUploadTools getFileUploadTools() {
return fileUploadTools;
}
public void setFileUploadTools(FileUploadTools fileUploadTools) {
this.fileUploadTools = fileUploadTools;
} @Override
public String execute() throws IOException {
fileUploadTools.beginUpload(); return SUCCESS;
}
}
FileUploadTools.java
package com.clzhang.struts2.demo12; import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date; import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext; public class FileUploadTools {
private String username;
private File uploadFile[];// 上传的文件是数组类型
private String uploadFileFileName[];// 文件名是数组类型
private String uploadFileContentType[]; public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
// 上传的ContentType文件类型也是数组类型
// 必须要加上对ContentType的声明,否则会出现异常
public String[] getUploadFileContentType() {
return uploadFileContentType;
}
public void setUploadFileContentType(String[] uploadFileContentType) {
this.uploadFileContentType = uploadFileContentType;
}
public File[] getUploadFile() {
return uploadFile;
}
public void setUploadFile(File[] uploadFile) {
this.uploadFile = uploadFile;
}
public String[] getUploadFileFileName() {
return uploadFileFileName;
}
public void setUploadFileFileName(String[] uploadFileFileName) {
this.uploadFileFileName = uploadFileFileName;
} public String beginUpload() throws IOException {
System.out.println("用户名:" + username); String targetDirectory = ServletActionContext.getServletContext().getRealPath("/upload");
for (int i = 0; i < uploadFile.length; i++) {
File target = new File(targetDirectory, new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss")
.format(new Date()).toString() + System.nanoTime() + uploadFileFileName[i]); FileUtils.copyFile(uploadFile[i], target);
} return "success";
}
}
2.3 设置上传文件相关参数(struts.properties),同上
2.4 修改struts.xml文件
<action name="uploadT2" class="com.clzhang.struts2.demo12.UploadTest2Action">
<result>/struts2/demo12/showResult2.jsp</result>
</action>
2.5 测试
打开IE,输入地址:http://127.0.0.1:8080/st/struts2/demo12/uploadTest2.jsp
结果如下:
任意选择三个文件后,提交,结果如下:
sruts2:单个文件上传,多个文件上传(属性驱动)的更多相关文章
- spring mvc文件上传(单个文件上传|多个文件上传)
单个文件上传spring mvc 实现文件上传需要引入两个必须的jar包 1.所需jar包: commons-fileupload-1.3.1.jar ...
- 利用struts2进行单个文件,批量文件上传,ajax异步上传以及下载
利用struts2进行单个文件,批量文件上传,ajax异步上传以及下载 1.页面显示代码 <%@ page language="java" import="java ...
- 单个input框上传多个文件操作
HTML页面: <div class="form-group thumb"> <label class="control-label col-xs-12 ...
- 为什么上传文件的表单里面要加一个属性enctype=multipart/form-data?
首先知道enctype这个属性管理的是表单的MIME编码.共有三个值可选:1.application/x-www-form-urlencoded2.multipart/form-data3.text/ ...
- [原创]java WEB学习笔记72:Struts2 学习之路-- 文件的上传下载,及上传下载相关问题
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- HTML5 文件域+FileReader 分段读取文件并上传(八)-WebSocket
一.同时上传多个文件处理 HTML: <div class="container"> <div class="panel panel-default&q ...
- java 通过sftp服务器上传下载删除文件
最近做了一个sftp服务器文件下载的功能,mark一下: 首先是一个SftpClientUtil 类,封装了对sftp服务器文件上传.下载.删除的方法 import java.io.File; imp ...
- SpringMVC单文件上传、多文件上传、文件列表显示、文件下载(转)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文详细讲解了SpringMVC实例单文件上传.多文件上传.文件列表显示.文件下载. 本文工程 ...
- yii2.0单文件上传和多文件上传
yii2文件上传使用到yii2自带的文件上传类UploadFIle,以及对应的模型规则,这里分别介绍单文件上传和多文件上传: yii2单个文件上传: 上传步奏,先创建上传表单模型model(包含验证规 ...
随机推荐
- hdu - 3952 Fruit Ninja(简单几何)
思路来自于:http://www.cnblogs.com/wuyiqi/archive/2011/11/06/2238530.html 枚举两个多边形的两个点组成的直线,判断能与几个多边形相交 因为最 ...
- [ASE][Daily Scrum]11.25
View Shilin Liu 修复现有的bug,子弹无法破坏射程内视野外的墙 Yiming Liao 无法看见从视野外到视野内的子弹 Server Songtao He 服务器处理子弹命中t ...
- Asp.net中HttpRequest.Params与Reques.Item之异同
今天才注意到HttpRequest.Params与HttpRequest.Item这两个玩意竟然有微妙的不同.上午的时候同事被坑了发现这玩意的说明还真微妙. 场景再现: 前台提交一个POST请求到后台 ...
- 设计模式->观察者模式
观察者模式能非常大的减少模块之前的耦合.具体的观察者模式,客官们可以去看<设计模式>或者<Head first设计模式>等之类的书. 在java中,java.util库中封装了 ...
- 【Windows 10 IoT - 2】LED闪烁及动画绘制(树莓派 Pi2)
在上一篇博文<Windows 10 IoT系统安装>中,我们实现了在树莓派2平台上运行Window 10 IoT,本篇文章将介绍在该平台上的程序开发. 在最初获得的资讯中,以为Window ...
- Entity Framework 4 数据事务操作
利用数据库链接进行事务操作 var db = ConnectionHelper.GetConn(ConnectionType.Write);//获取上下文 var conn = db.Connecti ...
- ASP.NET Core 源码阅读笔记(2) ---Microsoft.Extensions.DependencyInjection生命周期管理
在上一篇文章中我们主要分析了ASP.NET Core默认依赖注入容器的存储和解析,这一篇文章主要补充一下上一篇文章忽略的一些细节:有关服务回收的问题,即服务的生命周期问题.有关源码可以去GitHub上 ...
- ASP.NET Web API 2 中的特性路由
ASP.NET MVC 5.1 开始已经支持基于特性的路由(http://attributerouting.net),ASP.NET WEB API 2 同时也支持了这一特性. 启用特性路 由只需要在 ...
- IBM的“认知计算时代”
IBM 提出信息技术进入“认知计算时代”.所有电子设备都有潜力发展出认知能力,换言之,都可以像人一样‘思考’. 何为认知计算时代呢? 认知计算系统能够学习并与人类自然地交流,以扩展人类或机器可亲自执 ...
- ubuntu下firefox无法看bilibili解决方案
突然发现,在ubuntu中使用firefox打开bilibili网站无法加载视频与弹幕,在网上搜到的可能的问题为:linux下的firefox使用的flash player是老版本,bilibili不 ...