首先肯定是要配置好struts2环境,这个在另一篇《struts2环境搭建,以及一个简单实例》里已经讲过了

首先是网页部分,upload_file.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2.  
  3. <!DOCTYPE HTML>
  4. <html>
  5. <head>
  6. <title>Upload File</title>
  7. </head>
  8.  
  9. <body>
  10. <form action="UploadFile" method="post" enctype="multipart/form-data">
  11. <!--文件域-->
  12. <input type="file" name="source" /> <input type="submit" value="上传">
  13. </form>
  14. </body>
  15. </html>

查看代码

上传文件的表单,metho必须设置成post,enctype必须设置成multipart/form-data。

从上面代码中可以看到这个表单提交给了UploadFile这个action来处理,那我们在struts.xml里面配置如下:

  1. <action name="UploadFile" class="com.lidi.action.UploadAction">
  2. <result name="success">/uploadResult.jsp</result>
  3. <!--fileUpload拦截器,可用于限制上传文档的类型和文档大小 -->
  4. <interceptor-ref name="fileUpload">
  5. <!-- 限制文件大小20M,单位为字节 -->
  6. <param name="maximumSize">20971520</param>
  7. </interceptor-ref>
  8. <!--默认拦截器,必须声明在fileUpload拦截器之后 -->
  9. <interceptor-ref name="defaultStack" />
  10. </action>

fileUpload拦截器,用于设置上传路径,限制文件类型和大小。

关于限制文件大小,光有<param name="maximumSize">是不行的,还必须在<struts>标签下添加

  1. <constant name="struts.multipart.maxSize" value="21000000"/>

这行代码表示整个项目所有要上传文件的地方允许上传的文件大小的最大值,也就是说这个项目里上传的任何单个文件大小不能超过21000000字节(约20M),如果项目中不添加这行代码,则默认允许上传的文件大小最大为2M,所以这也是突破struts2只能上传2M文件的限制的方法。

关于限制文件类型,如果需要限制为图片文件,则<interceptor>可以这样配置

  1. <!-- 设置只允许上传图片文件 -->
  2.  
  3. <intercepter-ref name="fileUpload">
  4.  
  5. <param name="allowedTypes">image/bmp, image/x-png, image/gif, image/jpeg</param>
  6.  
  7. </intercepter-ref>
  8.  
  9. <interceptor-ref name="defaultStack" />

<param name="allowedTypes">标签中的值都是文件的MIME类型,常用文件的MIME类型可以在%TOMCAT_HOME%\conf\web.xml中找到。

如果要限制为word文件,则可以<interceptor>可以这样配置

  1. <!-- 设置只允许上传word文档 -->
  2.  
  3. <intercepter-ref name="fileUpload">
  4.  
  5. <param name="allowedTypes">application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document</param>
  6.  
  7. </intercepter-ref>
  8.  
  9. <interceptor-ref name="defaultStack" />

然而我感觉这样来限制文件类型,不如用javascript在前端实现限制。

接下来写UploadAction,UploadAction必需的私有属性是source,这是和upload_file.jsp里面文件域的name属性是一致,就是说文件域的name属性值为source,则UploadAction中必需有私有属性source,另外,还有两个比较重要的私有属性:

  1. private String sourceFileName; //待上传文件的文件名
  2. private String sourceContentType; //待上传文件的文件类型

这两个变量名的格式就是前面的前缀source和upload_file.jsp中的文件域的name属性相同。

综合来说,就是,比如upload_file.jsp中文件域的name = “abc”,则Action中就需要这样定义

  1. private File abc;
  2. private String abcFileName;
  3. private String abcContentType;

abc会自动获取要上传的文件对象,abcFileName自动获取文件名,abcContentType自动获取文件类型。

关于上传路径,是我要重点说一下的。

如果是上传到绝对路径,那还挺好搞的,但如果要上传到项目根目录下的upload文件夹呢,怎么获得这个upload文件夹的完整路径?

我尝试过使用

  1. ServletActionContext.getServletContext().getRealPath("/upload");

但返回了null。也用过

  1. ServletActionContext.getRequest().getRealPath("/upload");

还是返回了null。但在网上查下这个问题,很多人都推荐这么写,证明可能某些情况下这样写确实是可行的,但也有跟我一样返回null的人,他们同时推荐了一种新的方法,就是让UploadAction实现ServletContextAware接口。具体做法如下:

  1. public class UploadAction extends ActionSupport implements ServletContextAware {
  2.  
  3. /**
  4. * 省略其它代码...
  5. */
  6. private ServletContext context;
  7.  
  8. public ServletContext getContext() {
  9. return context;
  10. }
  11.  
  12. public void setContext(ServletContext context) {
  13. this.context = context;
  14. }
  15.  
  16. @Override
  17. public void setServletContext(ServletContext context) {
  18. this.context = context;
  19. }
  20. }

然后使用

  1. String path = context.getRealPath("/upload");// 重要:斜杠不能少

获得upload文件夹的路径。然后执行上传:

  1. /*将文件上传到upload文件夹下*/
  2. File savefile = new File(path, sourceFileName);
  3. FileUtils.copyFile(source, savefile);

我个人是比较推荐这种方法的,因为这种方法好像规避了当项目被打包转移到其它环境时也能保证获得正确的路径。

后面贴上UploadAction的完整代码UploadAction.java

  1. package com.lidi.action;
  2.  
  3. import java.io.File;
  4. import java.io.IOException;
  5. import javax.servlet.ServletContext;
  6. import org.apache.commons.io.FileUtils;
  7. import org.apache.struts2.util.ServletContextAware;
  8. import com.opensymphony.xwork2.ActionSupport;
  9.  
  10. public class UploadAction extends ActionSupport implements ServletContextAware {
  11.  
  12. /**
  13. *
  14. */
  15. private static final long serialVersionUID = 1L;
  16. private File source;// 待上传文件
  17. private String sourceFileName;// 待上传文件的文件名
  18. private String sourceContentType; // 待上传文件的文件类型
  19. private ServletContext context; // 重要
  20.  
  21. /* 重要 */
  22. public ServletContext getContext() {
  23. return context;
  24. }
  25.  
  26. public void setContext(ServletContext context) {
  27. this.context = context;
  28. }
  29.  
  30. /* getters & setters */
  31. public File getSource() {
  32. return source;
  33. }
  34.  
  35. public void setSource(File source) {
  36. this.source = source;
  37. }
  38.  
  39. public String getSourceFileName() {
  40. return sourceFileName;
  41. }
  42.  
  43. public void setSourceFileName(String sourceFileName) {
  44. this.sourceFileName = sourceFileName;
  45. }
  46.  
  47. public String getSourceContentType() {
  48. return sourceContentType;
  49. }
  50.  
  51. public void setSourceContentType(String sourceContentType) {
  52. this.sourceContentType = sourceContentType;
  53. }
  54.  
  55. @Override
  56. public void setServletContext(ServletContext context) {
  57. this.context = context;
  58. }
  59.  
  60. public String execute() throws IOException {
  61. /*获取存放上传文件的路径:项目根目录upload文件夹*/
  62. String path;
  63. path = context.getRealPath("/upload");// 重要:斜杠不能少
  64. System.out.println(path);
  65.  
  66. /*将文件上传到upload文件夹下*/
  67. File savefile = new File(path, sourceFileName);
  68. FileUtils.copyFile(source, savefile);
  69. System.out.println(savefile.getAbsolutePath());
  70.  
  71. return SUCCESS;
  72. }
  73. }

查看代码

上传结果页uploadResult.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%@ taglib uri="/struts-tags" prefix="s"%>
  3.  
  4. <!DOCTYPE HTML>
  5. <html>
  6. <head>
  7. <title>Upload Result</title>
  8. </head>
  9.  
  10. <body>
  11. <p>文件名:<s:property value="sourceFileName" /></p>
  12. <p>文件类型:<s:property value="sourceContentType" /></p>
  13. <p>文件:<a href="upload/<s:property value="sourceFileName" />"><s:property value="sourceFileName" /></a></p>
  14. </body>
  15. </html>

查看代码

Struts2文件上传,以及各种注意事项的更多相关文章

  1. 【Java EE 学习 35 下】【struts2】【struts2文件上传】【struts2自定义拦截器】【struts2手动验证】

    一.struts2文件上传 1.上传文件的时候要求必须使得表单的enctype属性设置为multipart/form-data,把它的method属性设置为post 2.上传单个文件的时候需要在Act ...

  2. springMvc 使用ajax上传文件,返回获取的文件数据 附Struts2文件上传

    总结一下 springMvc使用ajax文件上传 首先说明一下,以下代码所解决的问题 :前端通过input file 标签获取文件,通过ajax与后端交互,后端获取文件,读取excel文件内容,返回e ...

  3. Struts2文件上传下载

    Struts2文件上传 Struts2提供 FileUpload拦截器,用于解析 multipart/form-data 编码格式请求,解析上传文件的内容,fileUpload拦截器 默认在defau ...

  4. Struts2文件上传和下载(原理)

    转自:http://zhou568xiao.iteye.com/blog/220732 1.    文件上传的原理:表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值:1)     ...

  5. struts2文件上传大小限制问题小结

    一:首先看一下程序执行中出现的对应报错信息,如下所示: [WARN ] 2015-03-03 15:31:11 :Unable to parse request org.apache.commons. ...

  6. Struts2 文件上传

    一:表单准备 ① 要想使用HTML 表单上传一个或多个文件     –须把 HTML表单的 enctype属性设置为multipart/form-data     –须把HTML 表单的method ...

  7. JAVA Web 之 struts2文件上传下载演示(二)(转)

    JAVA Web 之 struts2文件上传下载演示(二) 一.文件上传演示 详细查看本人的另一篇博客 http://titanseason.iteye.com/blog/1489397 二.文件下载 ...

  8. JAVA Web 之 struts2文件上传下载演示(一)(转)

    JAVA Web 之 struts2文件上传下载演示(一) 一.文件上传演示 1.需要的jar包 大多数的jar包都是struts里面的,大家把jar包直接复制到WebContent/WEB-INF/ ...

  9. (八)Struts2 文件上传和下载

    所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:Struts2 文件上传 Struts2 文件上传基于Struts2 拦 ...

  10. struts2文件上传,文件类型 allowedTypes

    struts2文件上传,文件类型 allowedTypes 1 '.a' : 'application/octet-stream', 2 '.ai' : 'application/postscript ...

随机推荐

  1. Yii2.0学习笔记:创建登录表单

    第一步:在model层创建一个EntryForm.php文件 复制以下代码,注意model的文件.方法.类的命名规范(大小写) <?php namespace app\models; use Y ...

  2. android 歌词解析

    import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.F ...

  3. Linux文件查看/编辑方法介绍

    转载:https://www.centos.bz/2011/10/linux-file-view-edit/ cat 命令介绍 cat 命令的原含义为连接(concatenate), 用于连接多个文件 ...

  4. IOS 非常流畅的滑动tableView

    为什么要写这篇文章呢?之前写过一篇,因为手机打字不是很方便,还有之前同事用6splus 定下午茶时候,我滑动列表时候竟然误以为是安卓系统的手机.   tableview 流畅度可以用fps来测试,到6 ...

  5. Titanium中调用ios组件时语言不是本地化的解决方法

    用Titanium开发的ios应用中,当调用系统组件时,尽管手机已经设置了系统语言为中文,但那些组件的界面却仍为英文.比如调用iphone中的相册组件,其界面为: 那么怎么让它跟系统语言保持一致呢? ...

  6. 【web前端面试题整理07】我不理解表现与数据分离。。。

    拜师传说 今天老夫拜师了,老夫有幸认识一个JS高手,在此推荐其博客,悄悄告诉你,我拜他为师了,他承诺我只收我一个男弟子..... 师尊刚注册的账号,现在博客数量还不多,但是后面点会有干货哦,值得期待. ...

  7. [整理]详记被忽略的Get与Post

    [事发]使用了近5年的项目,来了一个最最基本的bug画面输入+号,跳转至后画面,+号变成了空格![原因]画面使用url(get)方法传参数,并且没有进行url转码!恐怖的是,几乎所有页面都是如此... ...

  8. 关于html页面head标签顺序

    基本上head就这几个标签么: <meta>.<link>.<title>.<script>.<style>.<base>. 它 ...

  9. .net弹出框

    弹出框可以使用div来显示在前台增加 <div id="flowDiv" runat="server"> <div class="r ...

  10. JavaScript中的各种变量提升(Hoisting)

    首先纠正下,文章标题里的 “变量提升” 名词是随大流叫法,“变量提升” 改为 “标识符提升” 更准确.因为变量一般指使用 var 声明的标识符,JS 里使用 function 声明的标识符也存在提升( ...