关于Struts2单文件上传

要实现Struts2框架的文件上传,需要用到2个jar包

  1. commons-fileupload-1.2.2.jar
  2. 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属性必须要写

 1 <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
 2 <%@ taglib prefix="s" uri="/struts-tags" %>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 7 <title>上传文件示例</title>
 8 </head>
 9 <body>
10 <s:actionerror/>
11 <s:fielderror/>
12 <s:form action="upload.action" theme="simple" namespace="/" method="post" enctype="multipart/form-data">
13     <s:file label="上传文件:" name="upload"></s:file>
14     <s:submit value="提交上传"></s:submit>
15 </s:form>
16 </body>
17 </html>

UploadAction.java

这里有几个注意点:

1、三个成员变量的命名是有规范的:

private File upload里的的upoload一样要和你上传提交页面里的name属性值对应一致

文件类型和文件名命名分别为:页面name属性值+ContentType,页面name属性值+FileName

2、提供setter方法,以便接收对应的数据

3、定义目标文件存放处,用commons-io-2.0.1.jar包提供的FileUtils工具类把上传文件复制到指定位置

 1 package com.lcw.struts2.upload;
 2
 3 import java.io.File;
 4 import java.io.IOException;
 5
 6 import org.apache.commons.io.FileUtils;
 7 import org.apache.struts2.ServletActionContext;
 8
 9 import com.opensymphony.xwork2.ActionSupport;
10
11 public class UploadAction extends ActionSupport {
12     //<s:file label="上传文件:" name="upload"></s:file>
13     private File upload;//命名应该和上传页面name属性值保持一致
14     private String uploadContentType;//属性值+ContentType
15     private String uploadFileName;//属性值+FielName
16
17     public void setUpload(File upload) {
18         this.upload = upload;
19     }
20
21     public void setUploadContentType(String uploadContentType) {
22         this.uploadContentType = uploadContentType;
23     }
24
25     public void setUploadFileName(String uploadFileName) {
26         this.uploadFileName = uploadFileName;
27     }
28
29     public String upload() {
30         File destFile = new File(ServletActionContext.getServletContext()
31                 .getRealPath("/uploads")
32                 + "/" + uploadFileName);
33         try {
34             //工具类
35             FileUtils.copyFile(upload, destFile);
36         } catch (IOException e) {
37             e.printStackTrace();
38         }
39         return SUCCESS;
40     }
41 }

struts.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE struts PUBLIC
 3     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
 4     "http://struts.apache.org/dtds/struts-2.0.dtd">
 5 <struts>
 6     <constant name="struts.devMode" value="true" />
 7     <!-- 全局国际化配置 -->
 8     <constant name="struts.custom.i18n.resources" value="messages"></constant>
 9
10     <package name="struts2test" extends="struts-default">
11         <action name="upload" class="com.lcw.struts2.upload.UploadAction" method="upload">
12             <result name="success">/index.jsp</result>
13             <result name="input">/upload.jsp</result>
14         </action>
15     </package>
16
17 </struts>

看下效果:

到这里基本的上传操作已经完成了,下面来下关于上传文件的配置参数:

首先我们打开Struts2的核心包文件:

在这个文件里,我们可以找到一些关于Struts2的常量和默认参数设置

其中我们可以看到2个参数:

①struts.multipart.saveDir    --默认的上传路径

struts.multipart.maxSize=2097152    --默认上传文件的大小

若我们想改变参数设置,我们可以在struts.xml里配置,例如改变上传文件大小限定..于此类推(这里改变的是全局设定)

1 <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里添加:

1 <interceptor-ref name="defaultStack">
2                 <param name="fileUpload.allowedExtensions">.txt</param>
3 </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单文件上传,布布扣,bubuko.com

时间: 2024-10-03 23:06:40

关于Struts2单文件上传的相关文章

Struts2单文件上传原理及示例

一.文件上传的原理 表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值: 1.application/x-www-form-urlencoded:这是默认编码方式,它只处理表单域里的value属性值,采用这种编码方式的表单会将表单域的值处理成URL编码方式. 2.multipart/form-data:这种编码方式的表单会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数里. 3.text/plain:这种方式主要适用于直接通过表单发送邮件的

Struts2单文件上传

第一步:首先写个上传文件的页面(简单的一个form表单) <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>文件上传</title> </head> <body> <h1>文件上传</h1> <br><br>

struts2实现文件上传和下载

在做B/S系统时,通常会涉及到上传文件和下载文件,在没接struts2框架之前,我们都是使用apache下面的commons子项目的FileUpload组件来进行文件的上传,但是那样做的话,代码看起来比较繁琐,而且不灵活,在学习了struts2后,struts2为文件上传下载提供了更好的实现机制,在这里我分别就单文件上传和多文件上传的源代码进行一下讲解,这里需要导入文件下载上传的两个jar文件,一个是commons-fileupload-1.2.2.jar,另一个是commons-io-2.0.

struts2之单文件上传(7)

前台页面jsp <form action="uploadAction" enctype="multipart/form-data" method="post"> <label>上传文件:</label> <input type="file" name="myfile"/> <input type="submit" value=&quo

【Java】Struts2文件上传-单文件上传,多文件上传

单文件上传 表单: <form action="upload1.action" method="post" enctype="multipart/form-data"> 姓名:<input type="text" name="name" id="name"><br> 照片:<input type="file" name=&qu

Struts2 单个文件上传/多文件上传

1导入struts2-blank.war所有jar包:\struts-2.3.4\apps\struts2-blank.war 单个文件上传 upload.jsp <s:form action="upload2.action" method="post" theme="simple" enctype="multipart/form-data"> <tr> <td id="more&quo

Struts2多文件上传

第一步:首先创建一个多文件上传的页面 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>多文件上传</title> </head> <body> <h1>多文件上传</h1> <br><br> <form

Struts2完成文件上传

文件上传是WEB应用经常需要面对的问题.在大部分时候,用户的请求参数是在表单域输入的字符串,但如果为表单元素设置enctype="multipart/form-data"属性,则提交表单时候不再是以字符串方式提交请求参数,而是以二进制编码的方式提交请求,此时直接通过HttpServletRequest的getParameter方法就无法正常获取请求参数的值,而通过二进制流来获取请求内容,就可以获取到上传文件的内容,从而实现文件上传的功能. Struts2的文件上传支持在原有的文件上传项

struts2(六) 文件上传和下载

前面对文件下载提过一点点,这里正好要讲文件上传,就放在一起在说一遍. --WH 一.单文件上传 在没学struts2之前,我们要写文件上传,非常麻烦,需要手动一步步去获取表单中的各种属性,然后在进行相应的处理,而在struts2中就不需要了,因为有一个fileUpload拦截器帮我们全做完了.我们只需要添加一点点信息,就可以完成上传的功能. 1.Action中需要提供三个属性 File fieldName: //文件表单项名称,也就是上传控件所填写的name属性名 String fileCont