一、错误提示信息配置

昨天说到更改默认错误配置信息,我测试很多遍,一直都不对。下面贴出来,待以后有好方法了再补充吧。

首先新建一个properties文件,这里命名为testupload.properties,内容为:

  1. struts.messages.error.file.too.large=\u6587\u4EF6\u592A\u5927{0} "{1}" "{2}" {3}
  2. struts.messages.error.content.type.not.allowed=\u6587\u4EF6\u7C7B\u578B\u4E0D\u5141\u8BB8! {0} "{1}" "{2}" {3}
  3. struts.messages.error.file.extension.not.allowed=\u4E0D\u5141\u8BB8\u7684\u6269\u5C55\u540D! {0} "{1}" "{2}" {3}

这里将默认提示信息改为中文的。upload.xml中内容如下:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  4. "http://struts.apache.org/dtds/struts-2.3.dtd">
  5.  
  6. <struts>
  7. <!-- 对上传文件总大小进行设置 -->
  8. <constant name="struts.multipart.maxSize" value="20971520"></constant>
  9. <!-- 错误信息提示 -->
  10. <constant name="struts.custom.i18n.resources" value="testupload"/>
  11.  
  12. <package name="upload" extends="struts-default">
  13. <action name="UploadAction" class="action.UploadAction" method="uploadMethod">
  14. <result name="success" type="dispatcher">
  15. /WEB-INF/upload_success.jsp
  16. </result>
  17. <result name="input" type="dispatcher">
  18. upload.jsp
  19. </result>
  20. <!-- 对系统的拦截器进行设置 -->
  21. <interceptor-ref name="fileUpload">
  22. <!-- 对单个上传文件的大小进行设置,5M -->
  23. <param name="maximumSize">5242880</param>
  24. <!-- 对允许的文件扩展名进行设置,这里以英文逗号隔开 -->
  25. <param name="allowedExtensions">.txt,.xml</param>
  26. <!-- 对允许的文件类型进行设置,这里以英文逗号进行隔开 -->
  27. <param name="allowedTypes">text/plain,text/xml</param>
  28. </interceptor-ref>
  29. <!-- 显示引用默认的拦截器 -->
  30. <interceptor-ref name="defaultStack"></interceptor-ref>
  31. </action>
  32. </package>
  33.  
  34. </struts>

二、多个文件上传

只需要更改upload.jsp中的部分内容即可:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ taglib uri="/struts-tags" prefix="s" %>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>Insert title here</title>
  9. </head>
  10. <body>
  11. <s:form action="UploadAction" enctype="multipart/form-data" method="POST">
  12. <s:textfield label="上传用户" name="username"/>
  13. <s:file label="上传文件" name="upload" />
  14. <s:file label="上传文件" name="upload" />
  15. <s:file label="上传文件" name="upload" />
  16.  
  17. <s:submit value="提交"/>
  18. </s:form>
  19. </body>
  20. </html>

结果如下所示:

也可以将UploadAction.java中的file改为数组类型的,如下所示:

  1. package action;
  2.  
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileOutputStream;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;
  8.  
  9. import javax.servlet.ServletContext;
  10.  
  11. import org.apache.struts2.ServletActionContext;
  12.  
  13. import com.opensymphony.xwork2.ActionSupport;
  14.  
  15. /**
  16. * @ClassName: UploadAction
  17. * @Description: 文件上传
  18. * @author: amosli
  19. * @email:amosli@infomorrow.com
  20. * @date Jan 14, 2014 1:50:28 AM
  21. */
  22. public class UploadAction extends ActionSupport {
  23. private static final long serialVersionUID = -8920466592471253212L;
  24. private String username;// 用户名
  25. private String[] uploadContentType;// 上传文件的类型,(Fileupload拦截器传入的参数)
  26. private File[] upload;// 上传的文件,(Fileupload拦截器传入的参数)
  27. private String[] uploadFileName;// 上传文件的真实文件名,(Fileupload拦截器传入的参数)
  28.  
  29. public void setUsername(String username) {
  30. this.username = username;
  31. }
  32.  
  33. public String[] getUploadContentType() {
  34. return uploadContentType;
  35. }
  36.  
  37. public void setUploadContentType(String[] uploadContentType) {
  38. this.uploadContentType = uploadContentType;
  39. }
  40.  
  41. public File[] getUpload() {
  42. return upload;
  43. }
  44.  
  45. public void setUpload(File[] upload) {
  46. this.upload = upload;
  47. }
  48.  
  49. public String[] getUploadFileName() {
  50. return uploadFileName;
  51. }
  52.  
  53. public void setUploadFileName(String[] uploadFileName) {
  54. this.uploadFileName = uploadFileName;
  55. }
  56.  
  57. public String getUsername() {
  58. return username;
  59. }
  60.  
  61. public String uploadMethod() throws Exception {
  62. ServletContext context = ServletActionContext.getServletContext();
  63. String real_path = context.getRealPath("/WEB-INF/upload/");
  64. for (int i = 0; i < upload.length; i++) {
  65. InputStream inputStream = new FileInputStream(upload[i]);
  66. OutputStream outputStream = new FileOutputStream(real_path + "/" + uploadFileName);
  67. byte[] b = new byte[1024];
  68. int len = 0;
  69. while ((len = inputStream.read(b)) > 0) {
  70. outputStream.write(b, 0, len);
  71. }
  72. // 关闭流
  73. inputStream.close();
  74. outputStream.close();
  75. // 删除tmp文件,最好是用tyrcatch finally进行删除
  76. // upload[i].delete();
  77. }
  78.  
  79. return SUCCESS;
  80. }
  81.  
  82. }

这里没有立马删除是想做个演示,查看一下缓存文件空间生成了几个。

首先,将项目打包,生成war包,这里我用的是mvn package打的包。

其次,将tomcat启动,将成生的war包拷到webapp目录下。

最后,在浏览器演示多个文件上传。

演示结果如下图所示:

1、打开浏览器,上传a.txt,b.txt,c.txt三个文件

2、点击提交后,跳转到成功提示页面 

3.查看相对应的文件目录,这里没有删除缓存,所以可以看到三个缓存文件

 三、指定文件上传的路径

如何通过配置文件,手动指定文件的上传目录?

首先,在upload.xml中action标签中指定参数名为uploadPath,赋值为/home/amosli/develop/struts2_learn/

  1. <action name="UploadAction" class="action.UploadAction" method="uploadMethod">
  2. <param name="uploadPath">/home/amosli/develop/struts2_learn/</param>
  3. .................

全部的upload.xml文件为:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  4. "http://struts.apache.org/dtds/struts-2.3.dtd">
  5.  
  6. <struts>
  7. <!-- 对上传文件总大小进行设置 -->
  8. <constant name="struts.multipart.maxSize" value="20971520"></constant>
  9. <!-- 错误信息提示 -->
  10. <constant name="struts.custom.i18n.resources" value="testupload" />
  11.  
  12. <package name="upload" extends="struts-default">
  13. <action name="UploadAction" class="action.UploadAction" method="uploadMethod">
  14. <param name="uploadPath">/home/amosli/develop/struts2_learn/</param>
  15. <result name="success" type="dispatcher">
  16. /WEB-INF/upload_success.jsp
  17. </result>
  18. <result name="input" type="dispatcher">
  19. upload.jsp
  20. </result>
  21. <!-- 对系统的拦截器进行设置 -->
  22. <interceptor-ref name="fileUpload">
  23. <!-- 对单个上传文件的大小进行设置,5M -->
  24. <param name="maximumSize">5242880</param>
  25. <!-- 对允许的文件扩展名进行设置,这里以英文逗号隔开 -->
  26. <param name="allowedExtensions">.txt,.xml</param>
  27. <!-- 对允许的文件类型进行设置,这里以英文逗号进行隔开 -->
  28. <param name="allowedTypes">text/plain,text/xml</param>
  29. </interceptor-ref>
  30. <!-- 显示引用默认的拦截器 -->
  31. <interceptor-ref name="defaultStack"></interceptor-ref>
  32. </action>
  33. </package>
  34. </struts>

其次,在UploadAction.java中新建一个变量uploadPath,为其设置set方法。同时在uploadMethod方法中将目标文件夹改为uploadPath.

即,UploadAction.java为:

  1. package action;
  2.  
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileOutputStream;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;
  8.  
  9. import com.opensymphony.xwork2.ActionSupport;
  10.  
  11. /**
  12. * @ClassName: UploadAction
  13. * @Description: 文件上传
  14. * @author: amosli
  15. * @email:amosli@infomorrow.com
  16. * @date Jan 14, 2014 1:50:28 AM
  17. */
  18. public class UploadAction extends ActionSupport {
  19. private static final long serialVersionUID = -8920466592471253212L;
  20. private String username;// 用户名
  21. private String[] uploadContentType;// 上传文件的类型,(Fileupload拦截器传入的参数)
  22. private File[] upload;// 上传的文件,(Fileupload拦截器传入的参数)
  23. private String[] uploadFileName;// 上传文件的真实文件名,(Fileupload拦截器传入的参数)
  24. private String uploadPath;
  25.  
  26. public void setUploadPath(String uploadPath) {
  27. this.uploadPath = uploadPath;
  28. }
  29.  
  30. public void setUsername(String username) {
  31. this.username = username;
  32. }
  33.  
  34. public String[] getUploadContentType() {
  35. return uploadContentType;
  36. }
  37.  
  38. public void setUploadContentType(String[] uploadContentType) {
  39. this.uploadContentType = uploadContentType;
  40. }
  41.  
  42. public File[] getUpload() {
  43. return upload;
  44. }
  45.  
  46. public void setUpload(File[] upload) {
  47. this.upload = upload;
  48. }
  49.  
  50. public String[] getUploadFileName() {
  51. return uploadFileName;
  52. }
  53.  
  54. public void setUploadFileName(String[] uploadFileName) {
  55. this.uploadFileName = uploadFileName;
  56. }
  57.  
  58. public String getUsername() {
  59. return username;
  60. }
  61.  
  62. public String uploadMethod() throws Exception {
  63. // ServletContext context = ServletActionContext.getServletContext();
  64. // String real_path = context.getRealPath("/WEB-INF/upload/");
  65. for (int i = 0; i < upload.length; i++) {
  66. InputStream inputStream = new FileInputStream(upload[i]);
  67. OutputStream outputStream = new FileOutputStream(uploadPath + "/" + uploadFileName[i]);
  68. byte[] b = new byte[1024];
  69. int len = 0;
  70. while ((len = inputStream.read(b)) > 0) {
  71. outputStream.write(b, 0, len);
  72. }
  73. // 关闭流
  74. inputStream.close();
  75. outputStream.close();
  76. // 删除tmp文件,最好是用tyrcatch finally进行删除
  77. // upload[i].delete();
  78. }
  79.  
  80. return SUCCESS;
  81. }
  82.  
  83. }

最后,运行效果如下:

本文源码:https://github.com/amosli/strut2_learn

java struts2入门学习实例--使用struts2快速实现多个文件上传的更多相关文章

  1. java struts2入门学习实例--使用struts2快速实现上传

    一.文件上传快速入门 1).关于上传表单三要素 >>尽量以POST请求方式上传,因为GET支持文件大小是有限制的. >>必须要加上enctype="multipart ...

  2. Spring学习笔记2——表单数据验证、文件上传

    在上一章节Spring学习笔记1——IOC: 尽量使用注解以及java代码中,已经搭建了项目的整体框架,介绍了IOC以及mybatis.第二节主要介绍SpringMVC中的表单数据验证以及文件上传. ...

  3. java struts2入门学习实例--使用struts进行验证

    一.为什么要进行验证? 验证几乎是注册登录的必须前提,验证的主要作用有两点: 1.安全性 2.对用户提供差异化服务. 二.如何验证? ActionSupport类中有一个validate()方法,这是 ...

  4. java struts2入门学习实例--用户注册

     一.用户注册示例 register.jsp <%@ page language="java" contentType="text/html; charset=UT ...

  5. java struts2入门学习实例--将客户端IP地址和访问方式输出到浏览器

    实例1:实现客户端IP地址和访问方式输出到浏览器. IpAction.java package com.amos.web.action; import javax.servlet.http.HttpS ...

  6. java struts2入门学习实例--用户注册和用户登录整合

    需求: 1.用户注册(user_register.jsp)-->注册成功(UserRegister.action)-->显示注册信息(register_success.jsp)2.用户登录 ...

  7. 【Spring学习笔记-MVC】Spring MVC之多文件上传 (zhan)

    http://www.cnblogs.com/ssslinppp/p/4607330.html (zhan)

  8. NodeJS学习笔记 进阶 (4)基于express+muter的文件上传(ok)

    个人总结:这篇文章主要讲了multer插件的使用,类似于formidable,可以用来处理post表单中的文件上传,读完这篇文章需要10分钟. 摘选自网络 概览 图片上传是web开发中经常用到的功能, ...

  9. java struts2入门学习---拦截器学习

    一.拦截器,拦截器栈 1.拦截器的作用 拦截器本质上和servlet的过滤器是一样的.在struts2中,拦截器能够对Action前后进行拦截,拦截器是一个可插拨的,你可以选择使用拦截器,也可以卸载拦 ...

随机推荐

  1. NLP 中的embedding layer

    https://blog.csdn.net/chuchus/article/details/78386059 词汇是语料库的基本元素, 所以, 使用embedding layer来学习词嵌入, 将一个 ...

  2. Java Web 生成临时文件并下载(原)

    概述:本文是  java 服务器端生成文件并下载的示例,并不完善,下载之后一般来说还需要删除临时文件. 注意:临时文件存放在 /WEB-INF/tmp 目录下,所以先要把  tmp 目录建起来. pu ...

  3. (转)C#中的委托(Delegate)和事件(Event)

    转自:http://blog.chinaunix.net/uid-576762-id-2733751.html   把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写 ...

  4. (转)Unity3D中脚本的执行顺序和编译顺序(vs工程引用关系)

    自:http://www.cnblogs.com/champ/p/execorder.html 在Unity中可以同时创建很多脚本,并且可以分别绑定到不同的游戏对象上,它们各自都在自己的生命周期中运行 ...

  5. oauth2-server-php-docs 授权控制器

    授权控制器 概观 对于授权端点,要求用户使用authorization code(授权码授权类型)或access token(隐式授权类型)对客户端进行认证和重定向. 方法 handleAuthori ...

  6. C++ 函数适配器

    1.考虑下面的需求,在一个int的vector中,找出一个比5的元素,容易想到的解决办法,定义一个方法对象,使用模板,如下:vector<int>::iterator iter = fin ...

  7. OpenWRT下实现Portal认证(WEB认证)

    首先简单介绍一下什么是Portal认证,Portal认证,通常也会叫Web认证,未认证用户上网时,设备强制用户登录到特定站点,用户可以免费访问其中的服务.当用户需要使用互联网中的其它信息时,必须在门户 ...

  8. 使用jstl报错:Can not find the tag library descriptor for “http://java.sun.com/jstl/core”

    使用jstl报错:Can not find the tag library descriptor for “http://java.sun.com/jstl/core” 出现这个错误的原因是项目中没有 ...

  9. javascript 替换 window.onload 的 document.ready

    通常我们想要在页面内容加载完成后运行 JS 时,都会使用 window.onload 来处理,比如: window.onload = function(){      alert('Hello Wor ...

  10. 分析jQuery源码时记录的一点感悟

    分析jQuery源码时记录的一点感悟      1.  链式写法      这是jQuery语法上的最大特色,也许该改改POJO里的set方法,和其他的非get方法什么的,可以把多行代码合并,减去每次 ...