关于Struts2的文件上传
要实现Struts2框架的文件上传,需要用到2个jar包
- commons-fileupload-1.2.2.jar
- commons-io-2.0.1.jar
由于文件解析Struts2内部已经帮我们做好了,大大降低了开发难度,我们只需要在Action里设置好对应的参数,目录进行使用即可。
来个小示例:
upload.jsp
这个页面的表单有三点需要注意的:
1、表单必须使用post方式提交 2、表单编码类型 enctype="multipart/form-data" 3、<s:file label="上传文件:" name="upload"></s:file> name属性必须要写
<%@ 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=ISO-8859-1">
<title>上传文件示例</title>
</head>
<body>
<s:actionerror/>
<s:fielderror/>
<s:form action="upload.action" theme="simple" namespace="/" method="post" enctype="multipart/form-data">
<s:file label="上传文件:" name="upload"></s:file>
<s:submit value="提交上传"></s:submit>
</s:form>
</body>
</html>
UploadAction.java
这里有几个注意点:
1、三个成员变量的命名是有规范的:
private File upload里的的upoload一样要和你上传提交页面里的name属性值对应一致
文件类型和文件名命名分别为:页面name属性值+ContentType,页面name属性值+FileName
2、提供setter方法,以便接收对应的数据
3、定义目标文件存放处,用commons-io-2.0.1.jar包提供的FileUtils工具类把上传文件复制到指定位置
package com.lcw.struts2.upload; 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 UploadAction extends ActionSupport {
//<s:file label="上传文件:" name="upload"></s:file>
private File upload;//命名应该和上传页面name属性值保持一致
private String uploadContentType;//属性值+ContentType
private String uploadFileName;//属性值+FielName public void setUpload(File upload) {
this.upload = upload;
} public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
} public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
} public String upload() {
File destFile = new File(ServletActionContext.getServletContext()
.getRealPath("/uploads")
+ "/" + uploadFileName);
try {
//工具类
FileUtils.copyFile(upload, destFile);
} catch (IOException e) {
e.printStackTrace();
}
return SUCCESS;
}
}
struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<!-- 全局国际化配置 -->
<constant name="struts.custom.i18n.resources" value="messages"></constant> <package name="struts2test" extends="struts-default">
<action name="upload" class="com.lcw.struts2.upload.UploadAction" method="upload">
<result name="success">/index.jsp</result>
<result name="input">/upload.jsp</result>
</action>
</package> </struts>
看下效果:


到这里基本的上传操作已经完成了,下面来下关于上传文件的配置参数:
首先我们打开Struts2的核心包文件:
在这个文件里,我们可以找到一些关于Struts2的常量和默认参数设置
其中我们可以看到2个参数:
①struts.multipart.saveDir --默认的上传路径
②struts.multipart.maxSize=2097152 --默认上传文件的大小
若我们想改变参数设置,我们可以在struts.xml里配置,例如改变上传文件大小限定..于此类推(这里改变的是全局设定)
<constant name="struts.multipart.maxSize" value="200000"></constant>
若我们想对单独的表单做设定,struts2的拦截器FileUpload有3个属性可以供我们选择
①fileUpload.maximumSize: 上传文件的最大长度(以字节为单位), 默认值为 2 MB
②fileUpload.allowedTypes: 允许上传文件的类型, 各类型之间以逗号分隔
③fileUpload.allowedExtensions: 允许上传文件扩展名, 各扩展名之间以逗号分隔
关于参数,我们可以打开struts2的核心包里的struts-default.xml进行查看

我们可以发现fielUpload拦截器处于Struts2默认的拦截栈里,并且可以发现这个拦截栈引用了workflow,调用Action的validate方法,一旦有错误返回,重新定位到INPUT页面
例如:我们保持以上上传代码不变,在配置文件的Actin里添加:
<interceptor-ref name="defaultStack">
<param name="fileUpload.allowedExtensions">.txt</param>
</interceptor-ref>
设置允许上传文件类型为txt,此时来看看效果:

很明显,上传失败了,也就意味我们的配置文件限制起作用了。
那么关于错误信息的回显
1、 若我们是针对常量做设置,出错则跳转input 视图, 通过 <s:actionError /> 回显错误信息
2、若我们是对fileLoad做设置,出错则在页面通过 <s:fieldError /> 回显错误信息
例如上面出现的回显错误信息File extension not allowed,我们可以在struts2的核心jar的struts-messages.properties里找到

其中的{0}{1}{2}{3}参数分别代表upload,"C和C++程序员的Lua快速入门.pdf" ,"upload__689312be_147f80f105d__8000_00000005.tmp" ,application/pdf
我们可以来个国际化覆盖对应的key值,进行我们想要的回显信息:

我上传一个word文件,看下此时的页面效果:

搞定搞定,写博客还是蛮累的。。。关于Struts2的多文件上传请戳这里:http://www.cnblogs.com/lichenwei/p/3928200.html
关于Struts2的文件上传的更多相关文章
- struts2的文件上传
在做B/S系统时,通常会涉及到上传文件和下载文件,在没接struts2框架之前,我们都是使用apache下面的commons子项目的FileUpload组件来进行文件的上传,但是那样做的话,代码看起来 ...
- jsp\struts1.2\struts2 中文件上传(转)
jsp\struts1.2\struts2 中文件上传 a.在jsp中简单利用Commons-fileupload组件实现 b.在struts1.2中实现c.在sturts2中实现现在把Code与大家 ...
- Struts2+Uploadify文件上传使用详解
Uploadify是JQuery的一个上传插件,实现的效果非常不错,带进度显示.不过官方提供的实例是php版本的,本文将详细介绍Uploadify在java中的使用,您也可以点击下面的链接进行演示或下 ...
- Struts2 多文件上传
Struts2多文件上传只需要将 单文件上传中的File变成File[] 即可,上篇文章:单文件上传 <form action="${pageContext.request.cont ...
- Struts2图片文件上传,判断图片格式和图片大小
1. 配置Struts2能够上传的最大文件大小 使用Struts2进行文件上传的时候,Struts2默认文件大小最大为2MB,如果要传大一点的文件,就需要修改struts.xml配置文件,重新设置能够 ...
- Struts2实现文件上传下载功能(批量上传)
今天来发布一个使用Struts2上传下载的项目, struts2为文件上传下载提供了好的实现机制, 首先,可以先看一下我的项目截图 关于需要使用的jar包,需要用到commons-fileupload ...
- Struts2实现文件上传(四)
Struts2实现文件上传 配置文件struts.xml <!-- /* * $Id: struts.xml 1364077 2012-07-21 12:57:02Z lukaszlenart ...
- Struts2实现文件上传(三)
Struts2实现文件上传 配置文件web.xml <?xml version="1.0" encoding="UTF-8"?> <web-a ...
- Struts2实现文件上传(二)
Struts2实现文件上传 文件上传页面 file.jsp: <%@ page language="java" import="java.util.*" ...
- Struts2实现文件上传(一)
Struts2实现文件上传 文件上传成功后结果页面 result.jsp: <%@ page language="java" import="java.util.* ...
随机推荐
- ios label 简单的长按复制文本信息
在iOS开发过程中,有时候会用到UILabel展示的内容,那么就设计到点击UILabel复制它上面展示的内容的功能,也就是Label长按复制功能.网上有很多种给Label添加长按复制功能的方法,这里我 ...
- C#如何调用R
1. 现在R中安装rscproxy库 > install.packages(rscproxy) > library(rscproxy) 2. 到这个网站http://rcom.univ ...
- [watchdog]内核失败的重启方案
1 在内核中配置看门狗驱动Linux-2.6.32.2 内核具有完善的S3C2440 的看梦狗驱动,我们只需配置一下就可以使用了.在内核源代码目录执行:make menuconfig,进入内核配置主菜 ...
- android——官方下拉刷新组件SwipeRefreshLayout(转)
一.问题描述 在android开发中,使用最多的数据刷新方式就是下拉刷新了,而完成此功能我们使用最多的就是第三方的开源库PullToRefresh.现如今,google也忍不住推出了自己的下拉组件Sw ...
- 如何在ROS中使用PCL(2)
记录关于我们运行roslaunch openni_launch openni.launch 命令时生成的话题以及这些话题的数据类型便于后期的处理,只有知道它们的数据结构,才能很好的对数据进行处理,我 ...
- Redis 实现消息队列 MQ
Redis 2.4版本之后就内置队列的功能了,如果是日常比较简单的队列应用,可以选择Redis , 效率还很高的!! Redis 还能实现 有序 和 无序 两种队列(只讨论生产者和消费者这种模式的队列 ...
- 表格细边框的两种CSS实现方法
在网页制作中,细边框这个制作方法是必不可少的.这里介绍2种常见的表格细边框制作方法,均通过XHTML验证. <!DOCTYPE html PUBLIC "-//W3C//DTD XHT ...
- Qt封装QTcpServer参考资料--QTcpServer多线程实现
目的:每个客户端连接的tcpSocket分别分配一个专门的线程来处理. 实现时分别继承QTcpServer和QTcpScoket实现出自己需要的类. 继承QTcpServer为每个客户端连接时分配线程 ...
- 解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)
一.Qt环境设置 文件从window上传到Ubuntu后会显示乱码,原因是因为ubuntu环境设置默认是utf-8,Windows默认都是GBK.Windows环境下,Qt Creator,菜单-&g ...
- 初试PyOpenGL三 (Python+OpenGL)GPGPU基本运算与乒乓技术
这篇GPGPU 概念1: 数组= 纹理 - 文档文章提出的数组与纹理相等让人打开新的眼界与思维,本文在这文基础上,尝试把这部分思想拿来用在VBO粒子系统上. 在前面的文章中,我们把CPU的数据传到GP ...