- 浏览: 579768 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
拯救各种不开心:
多谢博主分享,已经收藏:http://www.iwwenbo. ...
java反射机制详解 及 Method.invoke解释 -
Santer.Zhang:
你好,我用的是ireport4.5.1,子表一直无法显示
ireport 的一些技巧 -
Ginger90:
ireport实用性上没有帆软报表好用
ireport 的一些技巧 -
lenghongliang001:
破解版不行了,要注册才行
java实现tts(语音开发) -
best_programmer:
得到某个类的静态属性好像用你的方法不对啊,只能使用暴力反射吗? ...
java反射机制详解 及 Method.invoke解释
可以下载源代码直接看源代码,里面的注释很详细了。
1. 文件上传的原理:
表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值:
1) application/x-www-form-urlencoded:这是默认编码方式,它只处理表单域里的value属性值,采用这种编码方式的表单会将表单域的值处理成URL编码方式。
2) multipart/form-data:这种编码方式的表单会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数里。
3) text/plain:这种方式主要适用于直接通过表单发送邮件的方式。
文件上传是web应用经常用到的一个知识。原理是,通过为表单元素设置enctype=”multipart/form-data”属性,让表单提交的数据以二进制编码的方式提交,在接收此请求的Servlet中用二进制流来获取内容,就可以取得上传文件的内容,从而实现文件的上传。
在Java领域中,有两个常用的文件上传项目:一个是Apache组织Jakarta的Common-FileUpload组件(http://commons.apache.org/fileupload/),另一个是Oreilly组织的COS框架(http://www.servlets.com/cos/)。利用这两个框架都能很方便的实现文件的上传。
2. Struts2的文件上传:
Struts2并未提供自己的请求解析器,也就是就Struts2不会自己去处理multipart/form-data的请求,它需要调用其他请求解析器,将HTTP请求中的表单域解析出来。但Struts2在原有的上传解析器基础上做了进一步封装,更进一步简化了文件上传。
Struts2默认使用的是Jakarta的Common-FileUpload框架来上传文件,因此,要在web应用中增加两个Jar文件:commons-fileupload-1.2.jar和commons-io-1.3.1.jar。它在原上传框架上做了进一步封装,简化了文件上传的代码实现,取消了不同上传框架上的编程差异。
如果要改成其它的文件上传框架,可以修改struts.multipart.parser常量的值为cos/pell,默认值是jakata。并在classpath中增加相应上传组件的类库。
2.1. 步骤一:创建带上传表单域的页面
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<html>
<head>
<title>Struts2 File Upload</title>
</head>
<body>
<form action="fileUpload.action" method="POST" enctype="multipart/form-data">
文件标题:<input type="text" name="title" size="50"/><br/>
选择文件:<input type="file" name="upload" size="50"/><br/>
<input type="submit" value=" 上传 "/>
</form>
</body>
</html>
2.2. 步骤二:创建处理上传请求的Action类
package org.qiujy.web.struts2; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; /** *处理文件上传的Action类 *@authorqiujy *@version1.0 */ public class FileUploadAction extends ActionSupport { private static finalintBUFFER_SIZE = 16 * 1024; // 文件标题 private String title; // 上传文件域对象 private File upload; // 上传文件名 private String uploadFileName; // 上传文件类型 private String uploadContentType; // 保存文件的目录路径(通过依赖注入) private String savePath; //以下省略getter和setter...... //自己封装的一个把源文件对象复制成目标文件对象 privatestaticvoid copy(File src, File dst) { InputStream in = null; OutputStream out = null; try { in = new BufferedInputStream(new FileInputStream(src), BUFFER_SIZE); out = new BufferedOutputStream(new FileOutputStream(dst), BUFFER_SIZE); byte[] buffer = newbyte[BUFFER_SIZE]; int len = 0; while ((len = in.read(buffer)) > 0) { out.write(buffer, 0, len); } } catch (Exception e) { e.printStackTrace(); } finally { if (null != in) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } if (null != out) { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } } @Override public String execute() throws Exception { //根据服务器的文件保存地址和原文件名创建目录文件全路径 String dstPath = ServletActionContext.getServletContext() .getRealPath(this.getSavePath()) + "\\" + this.getUploadFileName(); System.out.println("上传的文件的类型:"+ this.getUploadContentType()); File dstFile = new File(dstPath); copy(this.upload, dstFile); return SUCCESS; } }
上面这个Action类中,提供了title和upload两个属性来分别对应页面的两个表单域属性,用来封装表单域的请求参数。
但是,值得注意的是,此Action中还有两个属性:uploadFileName和uploadContentType,这两个属性分别用于封装上传文件的文件名、文件类型。这是Struts2设计的独到之处:Strut2的Action类直接通过File类型属性直接封装了上传文件的文件内容,但这个File属性无法获取上传文件的文件名和文件类型,所以Struts2就直接将文件域中包含的上传文件名和文件类型的信息封装到uploadFileName和uploadContentType属性中,也就是说Struts2针对表单中名为xxx的文件域,在对应的Action类中使用3个属性来封装该文件域信息:
l 类型为File的xxx属性:用来封装页面文件域对应的文件内容。
l 类型为String的xxxFileName属性:用来封装该文件域对应的文件的文件名。
l 类型为String的xxxContentType属性:用来封装该文件域应用的文件的文件类型。
另外,在这个Action类中还有一个savePath属性,它的值是通过配置文件来动态设置的,这也是Strut2设计中的一个依赖注入特性的使用。
2.3. 步骤三:配置
struts.xml文件:
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name ="fileUploadDemo" extends ="struts-default"> <action name ="fileUpload" class ="org.qiujy.web.struts2.FileUploadAction"> <!-- 动态设置Action中的savePath属性的值 --> <param name="savePath">/upload</param> <result name ="success">/showupload.jsp</result> </action > </package > </struts>
在这个文件中跟以前配置唯一不同的是给action配置了一个<param …/>元素,用来为该Action的savePath属性动态注入值。
web.xml中的配置跟以前的应用一样。说明一点:好多网络文章说Struts2上传时要在web.xml中配置一个名为ActionContextUp的过滤器,说是有一些莫名的错误,可是是我用了Struts2新版本2.0.9GA版,测了n次,没出现什么问题,所以没配置。
2.4. 运行调试:
运行前要在根目录下创建一个名为upload的文件夹,用来存放上传后的文件。
上传结果:
3. 文件类型及错误输出:
Struts2提供了一个文件上传的拦截器(名为fileUpload),通过配置这个拦截器能轻松地实现文件类型的过滤。
在上例中,若要配置上传的文件只能是一些普通的图片文件格式:image/bmp、image/png、image/gif、image/jpeg、image/jpg等,则可在struts.xml文件中按如下方式配置:
<!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.custom.i18n.resources" value="messages"/> <package name="fileUploadDemo" extends="struts-default"> <action name="fileUpload" class="org.qiujy.web.struts2.FileUploadAction"> <interceptor-ref name="fileUpload"> <!-- 配置允许上传的文件类型,多个用","分隔 --> <param name="allowedTypes"> image/bmp,image/png,image/gif,image/jpeg,image/jpg ,image/x-png, image/pjpeg </param> <!-- 配置允许上传的文件大小,单位字节 --> <param name="maximumSize">102400</param> </interceptor-ref> <interceptor-ref name="defaultStack" /> <!-- 动态设置Action中的savePath属性的值 --> <param name="savePath">/upload</param> <result name="input">/index.jsp</result> <result name="success">/showupload.jsp</result> </action> </package> </struts>
如果上传文件失败,系统返回到input对应的页面,要在input对应的页面输出文件过滤失败信息,可以在input对应的页面中增加 <s:fielderror/>来显示错误信息。
运行调试:
结果:
显然,这样的提示不太友好,应用使用国际化信息。在国际化资源文件中添加如下三句:
#更改上传文件类型不允许的提示信息
struts.messages.error.content.type.not.allowed=文件上传失败:你要上传的文件类型不允许
#更改上传文件太大的提示信息
struts.messages.error.file.too.large=文件上传失败:你要上传的文件太大
#文件上传其它错误信息
struts.messages.error.uploading=文件上传失败:发生内部错误
别忘了要用native2ascii.exe进行编码转换哦。再运行调试:
另外,在控制台会看到一条消息:
Unable to find 'struts.multipart.saveDir' property setting. Defaulting to javax.servlet.context.tempdir
Removing file upload D:\tomcat6.0.13\work\Catalina\localhost\fileload_struts2\upload__4b616fd1_115a3d5d9dc__7fff_00000005.tmp
第一个说是找不以struts.multipart.saveDir,即没有指定临时文件夹,这个很好解决,只需指定一个struts.multipart.saveDir常量值为某个目录来解决。第二个说正在删除一个临时文件,这个临时文件是上传过程中产生的,属正常。
4. 多文件上传:
Struts2也可以很方便地实现多文件上传。
在输入表单域增加多个文件域:multifileupload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<html>
<head>
<title>多文件上传</title>
</head>
<body>
<font color="red"><s:fielderror/></font>
<form action="multiFileUpload.action" method="POST" enctype="multipart/form-data">
文件标题:<input type="text" name="title" size="50" value="${param.title }"/><br/>
<!-- 设置二个文件域,名字相同 -->
选择第一个文件:<input type="file" name="upload" size="50"/><br/>
选择第二个文件:<input type="file" name="upload" size="50"/><br/>
<input type="submit" value=" 上传 "/>
</form>
</body>
</html>
在Action类中用数组来封装该多个文件域:MultiFileUploadAction.java
- package org.qiujy.web.struts2;
- import java.io.BufferedInputStream;
- import java.io.BufferedOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import org.apache.struts2.ServletActionContext;
- import com.opensymphony.xwork2.ActionSupport;
- /**
- *处理多文件上传的Action类
- *
- *@authorqiujy
- *@version1.0
- */
- public class MultiFileUploadAction extends ActionSupport {
- private static finalintBUFFER_SIZE = 16 * 1024;
- // 文件标题
- private String title;
- // 用File数组来封装多个上传文件域对象
- private File[] upload;
- // 用String数组来封装多个上传文件名
- private String[] uploadFileName;
- // 用String数组来封装多个上传文件类型
- private String[] uploadContentType;
- // 保存文件的目录路径(通过依赖注入)
- private String savePath;
- //以下为所有属性的getter和setter。省略。。。
- // 自己封装的一个把源文件对象复制成目标文件对象
- private static void copy(File src, File dst) {
- InputStream in = null;
- OutputStream out = null;
- try {
- in = new BufferedInputStream(new FileInputStream(src), BUFFER_SIZE);
- out = new BufferedOutputStream(new FileOutputStream(dst),
- BUFFER_SIZE);
- byte[] buffer = newbyte[BUFFER_SIZE];
- int len = 0;
- while ((len = in.read(buffer)) > 0) {
- out.write(buffer, 0, len);
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (null != in) {
- try {
- in.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- if (null != out) {
- try {
- out.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
- @Override
- public String execute() throws Exception {
- File[] srcFiles = this.getUpload();
- // 处理每个要上传的文件
- for (int i = 0; i < srcFiles.length; i++) {
- // 根据服务器的文件保存地址和原文件名创建目录文件全路径
- String dstPath = ServletActionContext.getServletContext()
- .getRealPath(this.getSavePath())
- + "\\" + this.getUploadFileName()[i];
- File dstFile = new File(dstPath);
- this.copy(srcFiles[i], dstFile);
- }
- return SUCCESS;
- }
- }
- 运行结果:
- 5. Struts2的文件下载:
- 文件下载相对简单一些,一般只需在页面上提供一个超链接,该链接的href属性等于要下载文件的文件名就行了。但当文件名有中文时,就会导致失败;或者要在用户下载前进行权限判断,这时用Struts2提供的文件下载功能就能简单的解决这些问题。
- UploadAndDown.rar (3.3 MB)
- 下载次数: 66
发表评论
-
struts2学习笔记-struts2.xml文件结构
2009-07-10 11:40 2694<?xml version="1. ... -
struts2学习笔记-内置拦截器简单说明
2009-07-01 14:09 2136alias:实现在不同请求 ... -
struts2学习笔记-拦截器的使用及监听器
2009-06-30 23:14 2904一、拦截器是怎么实现: 实际上它是用Java中的动态代理来实 ... -
Struts2类型转换(一)----常规类型,自定义类型,错误处理
2009-06-25 17:10 1430Struts2的类型转换是基于OGNL表达式的.有良好的扩展性 ... -
struts2学习笔记-类型转换器
2009-06-25 10:39 1497一、概述 在B/S应 ... -
struts2学习笔记-servlet在web中的配置详解
2009-06-22 14:47 2473<?xml version="1.0" ... -
struts2学习笔记-有关struts异常的部分内容
2009-06-22 09:20 1484一、声明式异常捕捉:struts2的异常处理机制是通过在str ... -
struts2学习笔记-模型驱动和属性驱动
2009-06-19 17:24 37021.属性驱动 属性驱动是指用Action的属性来封装来回请 ... -
struts2学习笔记-Result详解
2009-06-19 15:45 2637chain Action链式处理的结果类型。 ... -
struts2学习笔记-默认Action及跳转注意
2009-06-19 15:31 5166对于使用Struts2框架的应用而言,尽量不要让超链接 ... -
struts2学习笔记-Action的通配符使用-映射关系3
2009-06-19 11:47 2279来看一个例子,例如有一个CrudAction, 其中有两个方法 ... -
struts2学习笔记-Action的method属性的使用-映射关系2
2009-06-18 21:59 3140Action的method属性配置主要用于将Action类中的 ... -
struts2学习笔记-动态方法的调用-映射关系1
2009-06-18 21:24 1732Struts1框架提供了DispatchA ... -
Struts2学习笔记-Action访问ServletAPI
2009-06-18 17:08 1850Action访问ServletAPI struts2 ... -
struts2学习笔记-struts2的配置文件
2009-06-18 14:12 2267一、struts.xml定义Bean的作用: 1.创建 ... -
struts2必要的包
2009-06-12 21:08 2980想正常使用struts2.1.6,至少需要如下6 个jar包: ... -
struts2学习笔记-简单介绍
2009-06-11 16:30 1576一、struts.valueStack的使用 当A ...
相关推荐
### Struts2学习笔记知识点概览 #### 一、环境搭建 **1.1 Struts2简介** - **Struts2概述**:Struts2是一个开源的MVC框架,它结合了Struts 1.x、WebWork和其他一些框架的优点。Struts2的主要目标是简化Web应用程序...
- **文件上传**:利用 Struts2 的 FileUploadInterceptor 实现文件上传功能。 - **文件下载**:可以通过 Action 的响应流来实现文件下载。 #### 五、Struts2 实践技巧与优化 **5.1 性能优化** - **减少 Action ...
### Struts2学习笔记之文件上传与Ajax开发 #### Struts2文件上传 **文件上传简介** 文件上传是Web应用中常见的功能之一,Struts2框架内置了对文件上传的支持,使得开发者能够轻松地实现这一功能。为了确保文件...
在实际项目中,Struts2可以处理类型转换、文件上传下载、拦截器(Interceptor)防止重复提交等问题。Interceptor是Struts2中的重要特性,它允许在Action执行前后插入额外的处理逻辑,如登录验证、日志记录等。深入...
**五.Struts2的文件上传与下载** 1. **不使用Struts2进行上传**:可以使用Servlet API直接处理文件上传,但Struts2提供了更简便的API。 2. **使用Struts2进行上传**:Struts2提供`CommonsFileUploadInterceptor`来...
在本篇“Struts2学习笔记十四”中,我们将深入探讨Struts2框架如何实现文件上传和下载功能,这是web应用中常见的需求,尤其在处理用户提交的表单数据时。我们将不涉及具体代码,而是重点讲解相关概念和技术原理。 ...
### Struts2学习笔记知识点梳理 #### 一、Struts2框架概述 - **背景**:Struts2作为Struts1的升级版本,融合了WebWork框架的优点,由Apache基金会维护,是一个开源、免费的MVC框架。尽管随着时间的推移,Spring MVC...
在本篇“Struts2学习笔记十三”中,我们将深入探讨Struts2如何处理文件上传和下载,这是Web开发中常见的需求。 文件上传在Web应用中广泛用于让用户提交图片、文档或其他类型的数据。Struts2提供了一个名为`...
- 学习如何使用 Struts2 提供的各种标签和插件来简化开发工作。 综上所述,Struts2 是一个功能强大且灵活的 MVC 框架,适用于构建复杂的 Web 应用程序。通过深入理解其核心概念和技术细节,开发者能够充分利用 ...
通过深入学习和实践,你可以掌握Struts2的更多功能,如表单验证、文件上传下载、AJAX集成、Spring整合等,从而提高你的Java Web开发能力。同时,理解Struts2的工作原理对于后续学习其他MVC框架,如Spring MVC,也会...
在Struts2中,文件上传和下载是两个重要的功能,常用于处理用户在网页上提交的文件。在第12讲中,我们将深入探讨Struts2如何实现这两个特性。 首先,我们来看文件上传。在Web应用中,用户可能需要上传图片、文档或...
在第15讲中,我们聚焦于Struts2的文件上传和下载功能,这是web开发中常见的需求。在这里,我们将深入探讨这两个主题,同时也会涉及到一些源码分析和实用工具的使用。 **文件上传** 在Struts2中,文件上传是通过`...
### 传智播客Struts2全程学习笔记 #### Struts2的优点 1. **无侵入式设计**:与Struts1相比,Struts2的设计更为先进,它不依赖于Servlet API或Struts API,这使得Struts2更加灵活且易于集成到其他环境中。在代码...