Struts2文件上传,以及各种注意事项
首先肯定是要配置好struts2环境,这个在另一篇《struts2环境搭建,以及一个简单实例》里已经讲过了
首先是网页部分,upload_file.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML>
<html>
<head>
<title>Upload File</title>
</head> <body>
<form action="UploadFile" method="post" enctype="multipart/form-data">
<!--文件域-->
<input type="file" name="source" /> <input type="submit" value="上传">
</form>
</body>
</html>
查看代码
上传文件的表单,metho必须设置成post,enctype必须设置成multipart/form-data。
从上面代码中可以看到这个表单提交给了UploadFile这个action来处理,那我们在struts.xml里面配置如下:
<action name="UploadFile" class="com.lidi.action.UploadAction">
<result name="success">/uploadResult.jsp</result>
<!--fileUpload拦截器,可用于限制上传文档的类型和文档大小 -->
<interceptor-ref name="fileUpload">
<!-- 限制文件大小20M,单位为字节 -->
<param name="maximumSize">20971520</param>
</interceptor-ref>
<!--默认拦截器,必须声明在fileUpload拦截器之后 -->
<interceptor-ref name="defaultStack" />
</action>
fileUpload拦截器,用于设置上传路径,限制文件类型和大小。
关于限制文件大小,光有<param name="maximumSize">是不行的,还必须在<struts>标签下添加
<constant name="struts.multipart.maxSize" value="21000000"/>
这行代码表示整个项目所有要上传文件的地方允许上传的文件大小的最大值,也就是说这个项目里上传的任何单个文件大小不能超过21000000字节(约20M),如果项目中不添加这行代码,则默认允许上传的文件大小最大为2M,所以这也是突破struts2只能上传2M文件的限制的方法。
关于限制文件类型,如果需要限制为图片文件,则<interceptor>可以这样配置
<!-- 设置只允许上传图片文件 -->
<intercepter-ref name="fileUpload">
<param name="allowedTypes">image/bmp, image/x-png, image/gif, image/jpeg</param>
</intercepter-ref>
<interceptor-ref name="defaultStack" />
<param name="allowedTypes">标签中的值都是文件的MIME类型,常用文件的MIME类型可以在%TOMCAT_HOME%\conf\web.xml中找到。
如果要限制为word文件,则可以<interceptor>可以这样配置
<!-- 设置只允许上传word文档 -->
<intercepter-ref name="fileUpload">
<param name="allowedTypes">application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document</param>
</intercepter-ref>
<interceptor-ref name="defaultStack" />
然而我感觉这样来限制文件类型,不如用javascript在前端实现限制。
接下来写UploadAction,UploadAction必需的私有属性是source,这是和upload_file.jsp里面文件域的name属性是一致,就是说文件域的name属性值为source,则UploadAction中必需有私有属性source,另外,还有两个比较重要的私有属性:
private String sourceFileName; //待上传文件的文件名
private String sourceContentType; //待上传文件的文件类型
这两个变量名的格式就是前面的前缀source和upload_file.jsp中的文件域的name属性相同。
综合来说,就是,比如upload_file.jsp中文件域的name = “abc”,则Action中就需要这样定义
private File abc;
private String abcFileName;
private String abcContentType;
abc会自动获取要上传的文件对象,abcFileName自动获取文件名,abcContentType自动获取文件类型。
关于上传路径,是我要重点说一下的。
如果是上传到绝对路径,那还挺好搞的,但如果要上传到项目根目录下的upload文件夹呢,怎么获得这个upload文件夹的完整路径?
我尝试过使用
ServletActionContext.getServletContext().getRealPath("/upload");
但返回了null。也用过
ServletActionContext.getRequest().getRealPath("/upload");
还是返回了null。但在网上查下这个问题,很多人都推荐这么写,证明可能某些情况下这样写确实是可行的,但也有跟我一样返回null的人,他们同时推荐了一种新的方法,就是让UploadAction实现ServletContextAware接口。具体做法如下:
public class UploadAction extends ActionSupport implements ServletContextAware {
/**
* 省略其它代码...
*/
private ServletContext context;
public ServletContext getContext() {
return context;
}
public void setContext(ServletContext context) {
this.context = context;
}
@Override
public void setServletContext(ServletContext context) {
this.context = context;
}
}
然后使用
String path = context.getRealPath("/upload");// 重要:斜杠不能少
获得upload文件夹的路径。然后执行上传:
/*将文件上传到upload文件夹下*/
File savefile = new File(path, sourceFileName);
FileUtils.copyFile(source, savefile);
我个人是比较推荐这种方法的,因为这种方法好像规避了当项目被打包转移到其它环境时也能保证获得正确的路径。
后面贴上UploadAction的完整代码UploadAction.java
package com.lidi.action; import java.io.File;
import java.io.IOException;
import javax.servlet.ServletContext;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.util.ServletContextAware;
import com.opensymphony.xwork2.ActionSupport; public class UploadAction extends ActionSupport implements ServletContextAware { /**
*
*/
private static final long serialVersionUID = 1L;
private File source;// 待上传文件
private String sourceFileName;// 待上传文件的文件名
private String sourceContentType; // 待上传文件的文件类型
private ServletContext context; // 重要 /* 重要 */
public ServletContext getContext() {
return context;
} public void setContext(ServletContext context) {
this.context = context;
} /* getters & setters */
public File getSource() {
return source;
} public void setSource(File source) {
this.source = source;
} public String getSourceFileName() {
return sourceFileName;
} public void setSourceFileName(String sourceFileName) {
this.sourceFileName = sourceFileName;
} public String getSourceContentType() {
return sourceContentType;
} public void setSourceContentType(String sourceContentType) {
this.sourceContentType = sourceContentType;
} @Override
public void setServletContext(ServletContext context) {
this.context = context;
} public String execute() throws IOException {
/*获取存放上传文件的路径:项目根目录upload文件夹*/
String path;
path = context.getRealPath("/upload");// 重要:斜杠不能少
System.out.println(path); /*将文件上传到upload文件夹下*/
File savefile = new File(path, sourceFileName);
FileUtils.copyFile(source, savefile);
System.out.println(savefile.getAbsolutePath()); return SUCCESS;
}
}
查看代码
上传结果页uploadResult.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML>
<html>
<head>
<title>Upload Result</title>
</head> <body>
<p>文件名:<s:property value="sourceFileName" /></p>
<p>文件类型:<s:property value="sourceContentType" /></p>
<p>文件:<a href="upload/<s:property value="sourceFileName" />"><s:property value="sourceFileName" /></a></p>
</body>
</html>
查看代码
Struts2文件上传,以及各种注意事项的更多相关文章
- 【Java EE 学习 35 下】【struts2】【struts2文件上传】【struts2自定义拦截器】【struts2手动验证】
一.struts2文件上传 1.上传文件的时候要求必须使得表单的enctype属性设置为multipart/form-data,把它的method属性设置为post 2.上传单个文件的时候需要在Act ...
- springMvc 使用ajax上传文件,返回获取的文件数据 附Struts2文件上传
总结一下 springMvc使用ajax文件上传 首先说明一下,以下代码所解决的问题 :前端通过input file 标签获取文件,通过ajax与后端交互,后端获取文件,读取excel文件内容,返回e ...
- Struts2文件上传下载
Struts2文件上传 Struts2提供 FileUpload拦截器,用于解析 multipart/form-data 编码格式请求,解析上传文件的内容,fileUpload拦截器 默认在defau ...
- Struts2文件上传和下载(原理)
转自:http://zhou568xiao.iteye.com/blog/220732 1. 文件上传的原理:表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值:1) ...
- struts2文件上传大小限制问题小结
一:首先看一下程序执行中出现的对应报错信息,如下所示: [WARN ] 2015-03-03 15:31:11 :Unable to parse request org.apache.commons. ...
- Struts2 文件上传
一:表单准备 ① 要想使用HTML 表单上传一个或多个文件 –须把 HTML表单的 enctype属性设置为multipart/form-data –须把HTML 表单的method ...
- JAVA Web 之 struts2文件上传下载演示(二)(转)
JAVA Web 之 struts2文件上传下载演示(二) 一.文件上传演示 详细查看本人的另一篇博客 http://titanseason.iteye.com/blog/1489397 二.文件下载 ...
- JAVA Web 之 struts2文件上传下载演示(一)(转)
JAVA Web 之 struts2文件上传下载演示(一) 一.文件上传演示 1.需要的jar包 大多数的jar包都是struts里面的,大家把jar包直接复制到WebContent/WEB-INF/ ...
- (八)Struts2 文件上传和下载
所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:Struts2 文件上传 Struts2 文件上传基于Struts2 拦 ...
- struts2文件上传,文件类型 allowedTypes
struts2文件上传,文件类型 allowedTypes 1 '.a' : 'application/octet-stream', 2 '.ai' : 'application/postscript ...
随机推荐
- tmpfs:一种基于内存的文件系统
tmpfs是一种基于内存的文件系统, tmpfs有时候使用rm(物理内存),有时候使用swap(磁盘一块区域).根据实际情况进行分配. rm:物理内存.real memery的简称? 真实内存就是电脑 ...
- Redis-持久化
Redis 持久化 Redis 提供了不同持久化范围的选项: RDB 持久化以指定的时间间隔执行数据集的即时点(point-in-time)快照. AOF 持久化在服务端记录每次收到的写操作,在服务器 ...
- 来自 Codrops 的7种创新的拖放交互界面
Codrops 分享了一些界面拖放的交互设计想法.基本的思路是在拖动一个项目的时候,为特定的操作呈现出可投掷的区域.这节省了大量的界面空间 ,并给出了一个有趣的动态的互动.有很多应用场景,例如分类和组 ...
- Electron - 创建跨平台的桌面客户的应用程序
Electron 框架的前身是 Atom Shell,可以让你写使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序.它是基于io.js 和 Chromium 开源项目,并用于在 ...
- 精通 CSS 选择器(二)
补充了一些之前遗漏掉的选择器以及一些在 Selectors Level 4 中新定义的选择器. 属性选择器不区分大小写 [attribute="value" i],在 Select ...
- SharePoint 2013 修改表单认证登录页面
前 言 之前的博客我们介绍了如何为SharePoint配置表单登陆,但是,登陆页面是丑.很丑.非常丑.特别非常丑!我们现在就介绍一下如何定制SharePoint表单登陆页面! SharePoint 表 ...
- 开通了个人微信公众号:slbGTD,准备把GTD相关的内容写成一本书
<Get Things Done>是一本书的名字,简称为GTD,中文书名为<搞定>,同时GTD也是一种时间管理.自我管理的系统性方法,既有让你办事更有效率的技巧,也有多个的视角 ...
- iOS 检查更新
注意:苹果官方是不允许app具有检查更新提示! //直接跳转到AppStore - (void)setUpAppUpdate { [ServerData queryGetURL:@{@" ...
- Java中的两个关键字——super、this
Java中的两个关键字——super.this 神话丿小王子的博客主页 一.super super 是java中方的一个关键字,用它可以引用父类中的成员: super可用于访问父类中定义的属性 sup ...
- TextView 字数限制
给大家推荐一个 无bug的 字数限制 http://blog.csdn.net/u012460084/article/details/50377928