java struts2入门学习实例--使用struts2快速实现多个文件上传
一、错误提示信息配置
昨天说到更改默认错误配置信息,我测试很多遍,一直都不对。下面贴出来,待以后有好方法了再补充吧。
首先新建一个properties文件,这里命名为testupload.properties,内容为:
struts.messages.error.file.too.large=\u6587\u4EF6\u592A\u5927{0} "{1}" "{2}" {3}
struts.messages.error.content.type.not.allowed=\u6587\u4EF6\u7C7B\u578B\u4E0D\u5141\u8BB8! {0} "{1}" "{2}" {3}
struts.messages.error.file.extension.not.allowed=\u4E0D\u5141\u8BB8\u7684\u6269\u5C55\u540D! {0} "{1}" "{2}" {3}
这里将默认提示信息改为中文的。upload.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.multipart.maxSize" value="20971520"></constant>
<!-- 错误信息提示 -->
<constant name="struts.custom.i18n.resources" value="testupload"/> <package name="upload" extends="struts-default">
<action name="UploadAction" class="action.UploadAction" method="uploadMethod">
<result name="success" type="dispatcher">
/WEB-INF/upload_success.jsp
</result>
<result name="input" type="dispatcher">
upload.jsp
</result>
<!-- 对系统的拦截器进行设置 -->
<interceptor-ref name="fileUpload">
<!-- 对单个上传文件的大小进行设置,5M -->
<param name="maximumSize">5242880</param>
<!-- 对允许的文件扩展名进行设置,这里以英文逗号隔开 -->
<param name="allowedExtensions">.txt,.xml</param>
<!-- 对允许的文件类型进行设置,这里以英文逗号进行隔开 -->
<param name="allowedTypes">text/plain,text/xml</param>
</interceptor-ref>
<!-- 显示引用默认的拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package> </struts>
二、多个文件上传
只需要更改upload.jsp中的部分内容即可:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!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:form action="UploadAction" enctype="multipart/form-data" method="POST">
<s:textfield label="上传用户" name="username"/>
<s:file label="上传文件" name="upload" />
<s:file label="上传文件" name="upload" />
<s:file label="上传文件" name="upload" /> <s:submit value="提交"/>
</s:form>
</body>
</html>
结果如下所示:
也可以将UploadAction.java中的file改为数组类型的,如下所示:
package action; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream; import javax.servlet.ServletContext; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; /**
* @ClassName: UploadAction
* @Description: 文件上传
* @author: amosli
* @email:amosli@infomorrow.com
* @date Jan 14, 2014 1:50:28 AM
*/
public class UploadAction extends ActionSupport {
private static final long serialVersionUID = -8920466592471253212L;
private String username;// 用户名
private String[] uploadContentType;// 上传文件的类型,(Fileupload拦截器传入的参数)
private File[] upload;// 上传的文件,(Fileupload拦截器传入的参数)
private String[] uploadFileName;// 上传文件的真实文件名,(Fileupload拦截器传入的参数) public void setUsername(String username) {
this.username = username;
} public String[] getUploadContentType() {
return uploadContentType;
} public void setUploadContentType(String[] uploadContentType) {
this.uploadContentType = uploadContentType;
} public File[] getUpload() {
return upload;
} public void setUpload(File[] upload) {
this.upload = upload;
} public String[] getUploadFileName() {
return uploadFileName;
} public void setUploadFileName(String[] uploadFileName) {
this.uploadFileName = uploadFileName;
} public String getUsername() {
return username;
} public String uploadMethod() throws Exception {
ServletContext context = ServletActionContext.getServletContext();
String real_path = context.getRealPath("/WEB-INF/upload/");
for (int i = 0; i < upload.length; i++) {
InputStream inputStream = new FileInputStream(upload[i]);
OutputStream outputStream = new FileOutputStream(real_path + "/" + uploadFileName);
byte[] b = new byte[1024];
int len = 0;
while ((len = inputStream.read(b)) > 0) {
outputStream.write(b, 0, len);
}
// 关闭流
inputStream.close();
outputStream.close();
// 删除tmp文件,最好是用tyrcatch finally进行删除
// upload[i].delete();
} return SUCCESS;
} }
这里没有立马删除是想做个演示,查看一下缓存文件空间生成了几个。
首先,将项目打包,生成war包,这里我用的是mvn package打的包。
其次,将tomcat启动,将成生的war包拷到webapp目录下。
最后,在浏览器演示多个文件上传。
演示结果如下图所示:
1、打开浏览器,上传a.txt,b.txt,c.txt三个文件
2、点击提交后,跳转到成功提示页面
3.查看相对应的文件目录,这里没有删除缓存,所以可以看到三个缓存文件
三、指定文件上传的路径
如何通过配置文件,手动指定文件的上传目录?
首先,在upload.xml中action标签中指定参数名为uploadPath,赋值为/home/amosli/develop/struts2_learn/
<action name="UploadAction" class="action.UploadAction" method="uploadMethod">
<param name="uploadPath">/home/amosli/develop/struts2_learn/</param>
.................
全部的upload.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.multipart.maxSize" value="20971520"></constant>
<!-- 错误信息提示 -->
<constant name="struts.custom.i18n.resources" value="testupload" /> <package name="upload" extends="struts-default">
<action name="UploadAction" class="action.UploadAction" method="uploadMethod">
<param name="uploadPath">/home/amosli/develop/struts2_learn/</param>
<result name="success" type="dispatcher">
/WEB-INF/upload_success.jsp
</result>
<result name="input" type="dispatcher">
upload.jsp
</result>
<!-- 对系统的拦截器进行设置 -->
<interceptor-ref name="fileUpload">
<!-- 对单个上传文件的大小进行设置,5M -->
<param name="maximumSize">5242880</param>
<!-- 对允许的文件扩展名进行设置,这里以英文逗号隔开 -->
<param name="allowedExtensions">.txt,.xml</param>
<!-- 对允许的文件类型进行设置,这里以英文逗号进行隔开 -->
<param name="allowedTypes">text/plain,text/xml</param>
</interceptor-ref>
<!-- 显示引用默认的拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
</struts>
其次,在UploadAction.java中新建一个变量uploadPath,为其设置set方法。同时在uploadMethod方法中将目标文件夹改为uploadPath.
即,UploadAction.java为:
package action; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream; import com.opensymphony.xwork2.ActionSupport; /**
* @ClassName: UploadAction
* @Description: 文件上传
* @author: amosli
* @email:amosli@infomorrow.com
* @date Jan 14, 2014 1:50:28 AM
*/
public class UploadAction extends ActionSupport {
private static final long serialVersionUID = -8920466592471253212L;
private String username;// 用户名
private String[] uploadContentType;// 上传文件的类型,(Fileupload拦截器传入的参数)
private File[] upload;// 上传的文件,(Fileupload拦截器传入的参数)
private String[] uploadFileName;// 上传文件的真实文件名,(Fileupload拦截器传入的参数)
private String uploadPath; public void setUploadPath(String uploadPath) {
this.uploadPath = uploadPath;
} public void setUsername(String username) {
this.username = username;
} public String[] getUploadContentType() {
return uploadContentType;
} public void setUploadContentType(String[] uploadContentType) {
this.uploadContentType = uploadContentType;
} public File[] getUpload() {
return upload;
} public void setUpload(File[] upload) {
this.upload = upload;
} public String[] getUploadFileName() {
return uploadFileName;
} public void setUploadFileName(String[] uploadFileName) {
this.uploadFileName = uploadFileName;
} public String getUsername() {
return username;
} public String uploadMethod() throws Exception {
// ServletContext context = ServletActionContext.getServletContext();
// String real_path = context.getRealPath("/WEB-INF/upload/");
for (int i = 0; i < upload.length; i++) {
InputStream inputStream = new FileInputStream(upload[i]);
OutputStream outputStream = new FileOutputStream(uploadPath + "/" + uploadFileName[i]);
byte[] b = new byte[1024];
int len = 0;
while ((len = inputStream.read(b)) > 0) {
outputStream.write(b, 0, len);
}
// 关闭流
inputStream.close();
outputStream.close();
// 删除tmp文件,最好是用tyrcatch finally进行删除
// upload[i].delete();
} return SUCCESS;
} }
最后,运行效果如下:
本文源码:https://github.com/amosli/strut2_learn
java struts2入门学习实例--使用struts2快速实现多个文件上传的更多相关文章
- java struts2入门学习实例--使用struts2快速实现上传
一.文件上传快速入门 1).关于上传表单三要素 >>尽量以POST请求方式上传,因为GET支持文件大小是有限制的. >>必须要加上enctype="multipart ...
- Spring学习笔记2——表单数据验证、文件上传
在上一章节Spring学习笔记1——IOC: 尽量使用注解以及java代码中,已经搭建了项目的整体框架,介绍了IOC以及mybatis.第二节主要介绍SpringMVC中的表单数据验证以及文件上传. ...
- java struts2入门学习实例--使用struts进行验证
一.为什么要进行验证? 验证几乎是注册登录的必须前提,验证的主要作用有两点: 1.安全性 2.对用户提供差异化服务. 二.如何验证? ActionSupport类中有一个validate()方法,这是 ...
- java struts2入门学习实例--用户注册
一.用户注册示例 register.jsp <%@ page language="java" contentType="text/html; charset=UT ...
- java struts2入门学习实例--将客户端IP地址和访问方式输出到浏览器
实例1:实现客户端IP地址和访问方式输出到浏览器. IpAction.java package com.amos.web.action; import javax.servlet.http.HttpS ...
- java struts2入门学习实例--用户注册和用户登录整合
需求: 1.用户注册(user_register.jsp)-->注册成功(UserRegister.action)-->显示注册信息(register_success.jsp)2.用户登录 ...
- 【Spring学习笔记-MVC】Spring MVC之多文件上传 (zhan)
http://www.cnblogs.com/ssslinppp/p/4607330.html (zhan)
- NodeJS学习笔记 进阶 (4)基于express+muter的文件上传(ok)
个人总结:这篇文章主要讲了multer插件的使用,类似于formidable,可以用来处理post表单中的文件上传,读完这篇文章需要10分钟. 摘选自网络 概览 图片上传是web开发中经常用到的功能, ...
- java struts2入门学习---拦截器学习
一.拦截器,拦截器栈 1.拦截器的作用 拦截器本质上和servlet的过滤器是一样的.在struts2中,拦截器能够对Action前后进行拦截,拦截器是一个可插拨的,你可以选择使用拦截器,也可以卸载拦 ...
随机推荐
- C#开发winform程序的界面框架
首先创建一个“Windows应用程序”,默认的“Form1”文件修改为MainForm的窗体,作为程序的主窗体.从控件箱拖3个控件过来:MenuStrip.ToolStrip.StatusStrip. ...
- 利用blob对象实现大文件分片上传
首先说分片上传,我们在进行文件上传的时候,因为服务器的限制,会限制每一次上传到服务器的文件大小不会很大,这个时候我们就需要把一个需要上传的文件进行切割,然后分别进行上传到服务器. 假如需要做到这一步, ...
- Vue背景图打包之后访问路径错误
问题背景:项目里面有用到背景图片,开发模式下正常,打包之后发现报404错误.查看发现是背景图片引用路径出错. 解决方法: .map { width: %; height: 397px; backgro ...
- CSDN日报20170226——《你离心想事成仅仅差一个计划》
[程序人生] 你离心想事成仅仅差一个计划 作者:安晓辉 从目标怎样导出工作计划.我们会以"出版一本小说"为例来解说计划的形成过程. 在開始之前.我们先来说明一个概念:目标的两种类型 ...
- 【Java】Java-XML解析利器-SAX-高性能-易用
Java-XML解析利器-SAX-高性能-易用 java xml 大_百度搜索 (3)java处理比较大的xml文件 - SegmentFault How to read UTF-8 XML file ...
- 转:Eclipse配色方案
http://www.cnblogs.com/arci/archive/2011/01/23/1942646.html 参考配色方案: http://www.cs.cmu.edu/~maverick/ ...
- windows server 2012 st 版本的php环境问题修复 与删除
windows server 2012 st 版本的php环境问题修复 错误内容 HTTP 错误 500.0 - Internal Server Error C:\Program Files\iis ...
- Android 获得图片并解码成缩略图以减少内存消耗
本文内容 环境 演示 下载 Demo 环境 Windows 2008 R2 64 位 Eclipse ADT V22.6.2,Android 4.4.3 SAMSUNG GT-I9008L,Andro ...
- C#或Python中正则表达式元字符含意
一.列表 元字符 描述 \ 将下一个字符标记为一个特殊字符.或一个原义字符.或一个 向后引用.或一个八进制转义符.例如,'n' 匹配字符 "n".'\n' 匹配一个换行符.序列 ' ...
- ACID、Data Replication、CAP与BASE
ACID 在传数据库系统中,事务具有ACID 4个属性. (1) 原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行. (2) 一致性(Consiste ...