`
coolxing
  • 浏览: 874845 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
9a45b66b-c585-3a35-8680-2e466b75e3f8
Java Concurre...
浏览量:97542
社区版块
存档分类
最新评论

struts2--文件上传和uploadFile拦截器

阅读更多

[coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]

 

单文件上传

1. 通过HTML表单上传文件时, 需要将表单的enctype属性设置为multipart/form-data, method属性设置为post. 

jsp页面代码:

<form action="${pageContext.request.contextPath}/upload/uploadAction_saveFile.action"
	  name="form1" method="post" enctype="multipart/form-data">
	上传文件名称: <input type="file" name="strutsUpload">
	<input type="submit" value="上传">
</form>

2. 在Action类中定义一下3个成员变量, 并为其提供getter和setter方法:

private File strutsUpload; // 上传的文件
private String strutsUploadContentType;// 文件的类型
private String strutsUploadFileName;// 文件的名称

以上3个成员变量的名称不能随意更改, private File strutsUpload变量的名称必须和jsp中上传文件标签中的name属性的值一致. 而private String strutsUploadContentType变量的名称必须为"上传文件的名称+ContentType", private String strutsUploadFileName变量的名称必须为"上传文件的名称+FileName".

3. 在Action类中定义业务方法. 完整的Action类可以如下:

public class UploadAction extends ActionSupport {
	private File strutsUpload; // 上传的文件
	private String strutsUploadContentType;// 文件的类型
	private String strutsUploadFileName;// 文件的名称
	// 业务方法
	public String saveFile() {
		try {
			ServletContext context = ServletActionContext.getServletContext();
			// 获得当前web应用所在目录下file文件夹的绝对路径
			String path = context.getRealPath("/file");
			File destFile = new File(path, strutsUploadFileName);
			if (!destFile.exists()) {
				destFile.createNewFile();
			}
			FileUtils.copyFile(strutsUpload, destFile);
		} catch (IOException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
		return "success";
	}
	// 省略getter和setter方法
}

4. 在struts.xml文件中配置uploadFile拦截器的属性:

<package name="upload" namespace="/upload" extends="struts-default">
	<action name="uploadAction_*" class="cn.xing.upload.UploadAction" method="{1}">
		<interceptor-ref name="defaultStack">
			<!--
				修改允许上传文件的大小(默认值是2M),
				将调用FileUploadInterceptor中的setMaximumSize(223434555)
			-->
			<param name="fileUpload.maximumSize">223434555</param>
			<!-- 配置允许上传文件的类型,如果有多个类型用","隔开 -->
			<param name="fileUpload.allowedTypes">application/vnd.ms-excel,text/plain</param>
			<!--配置允许上传文件的扩展名,如果有多个用","隔开  -->
			<param name="fileUpload.allowedExtensions">txt,excel,ppt</param>
		</interceptor-ref>
		<result name="success">/upload/success.jsp</result>
		<result name="input">/upload/error.jsp</result>
	</action>
</package>

 

多文件上传

多文件上传与单文件上传类似, 只有jsp表单和Action类的代码有所不同.

1. jsp表单代码:

<form action="${pageContext.request.contextPath}/upload/uploadsAction_saveFiles.action"
	  name="form1" method="post" enctype="multipart/form-data">
	上传文件名称: <input type="file" name="strutsUploads"><br>
	上传文件名称: <input type="file" name="strutsUploads"><br>
	上传文件名称: <input type="file" name="strutsUploads"><br>
	<input type="submit" value="上传">
</form>

注意每个文件上传标签的name属性需要一致.

2. Action类:

public class UploadsAction extends ActionSupport {
	private File[] strutsUploads;
	private String[] strutsUploadsContentType;
	private String[] strutsUploadsFileName;
	public String saveFiles() {
		ServletContext context = ServletActionContext.getServletContext();
		String realpath = context.getRealPath("/file");
		try {
			if (strutsUploads != null && strutsUploads.length > 0) {
				for (int i = 0; i < strutsUploads.length; i++) {
					File destFile = new File(realpath, strutsUploadsFileName[i]);
					if (!destFile.exists()) {
						destFile.createNewFile();
					}
					FileUtils.copyFile(strutsUploads[i], destFile);
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return "success";
	}
	// 省略getter和setter方法
}

多文件上传时, Action中的3个成员变量的名称需要遵循与单文件上传时相同的规则. 此时3个成员变量均为数组.

3. 在struts.xml文件中配置uploadFile拦截器的属性, 同上.

 

错误显示

当文件上传过程中出错时, 如果定义了错误显示页面, 将跳转到指定的页面, 并输出错误信息.

1. 在action标签下定义如下子标签:

<!-- 定义上传出错要转向的页面 -->

<result name="input">/upload/error.jsp</result>

2. /upload/error.jsp页面可以使用<s:fielderror/>标签输出错误信息.

前提是已经使用taglib指令导入了struts标签库:

<%@ taglib uri="/struts-tags" prefix="s"%>

3. 默认的错误信息为英文, 在struts2-core-2.x.x.x.jar\org\apache\struts2\struts-messages.properties文件中定义:

struts.messages.error.uploading=Error uploading: {0}

struts.messages.error.file.too.large=File too large: {0} "{1}" "{2}" {3}

struts.messages.error.content.type.not.allowed=Content-Type not allowed: {0} "{1}" "{2}" {3}

struts.messages.error.file.extension.not.allowed=File extension not allowed: {0} "{1}" "{2}" {3}

{0}:<input type=“file” name=“uploadImage”>中name属性的值

{1}:上传文件的名称

{2}:上传文件保存到临时目录的名称

{3}:上传文件的类型(对struts.messages.error.file.too.large是上传文件的大小)

我们可以在Action的统计目录下创建一个fileuploadmessage.properties文件, 文件名没有要求, 但必须是properties文件, 在其中输入:

struts.messages.error.uploading=上传错误: {0}

struts.messages.error.file.too.large=文件太大: {0} "{1}" "{2}" {3}

struts.messages.error.content.type.not.allowed=不支持的文件类型: {0} "{1}" "{2}" {3}

struts.messages.error.file.extension.not.allowed=不支持的文件扩展名: {0} "{1}" "{2}" {3}

使用jdk目录下的native2ascii工具将中文转为unicode编码.

接下来需要在struts.xml文件中加载自定义的资源文件:

<constant name="struts.custom.i18n.resources" value="cn.xing.upload.fileuploadmessage"></constant>

 

6
2
分享到:
评论
3 楼 repeatthink 2013-06-24  
2 楼 814687491 2013-06-05  
感觉不错!
1 楼 814687491 2013-06-05  
试一下,看上去不错!!!

相关推荐

    struts2 单文件,多文件上传及拦截器实现异常处理

    在这个主题中,我们将深入探讨Struts2如何实现单文件和多文件上传,并通过拦截器来处理可能出现的异常。 首先,我们来看单文件上传。在Struts2中,使用`&lt;s:file&gt;`标签可以创建一个用于选择文件的输入字段。用户选择...

    struts2-文件上传-配置

    首先,为了支持文件上传,我们需要在Struts2的核心配置文件`struts.xml`中添加相应的拦截器。Struts2内置了一个名为`params`的拦截器,可以处理表单数据,但不包括文件。因此,我们需要引入`fileUpload`拦截器,该...

    [原]Struts2-文件上传与下载

    要实现文件上传,你需要在Struts2配置文件中添加相关的拦截器栈,如`params`和`fileUpload`拦截器。`fileUpload`拦截器负责解析多部分请求并存储上传的文件到临时目录。 在Action类中,你需要定义一个字段来接收...

    struts2中的文件上传和下载示例

    3. 配置Struts2:在struts.xml配置文件中,配置文件上传拦截器(`struts.multipart.parser`),如`org.apache.struts2.dispatcher.multipart.JakartaMultiPartParser`。 4. 编写Action:创建一个Action类,使用`@...

    struts2文件上传下载

    首先,你需要在项目的配置文件(如struts.xml)中启用文件上传的支持,并配置相应的拦截器。接着,在Action类中创建一个字段来接收上传的文件,Struts2会自动将文件内容绑定到这个字段上。 例如,你可以创建一个名...

    Struts2文件上传程序示例

    在`struts.xml`配置文件中,我们需要配置一个特定的拦截器——`params`和`fileUpload`拦截器,它们负责解析请求并处理文件数据。 接着,我们需要创建一个表单,包含一个`&lt;input type="file"&gt;`标签,让用户选择要...

    struts2文件上传下载(注解版)

    Struts2提供了一套完整的文件上传机制,主要依赖于`org.apache.struts2.interceptor.FileUploadInterceptor`拦截器。在这个项目中,`uploadFile.jsp`页面通常包含一个表单,用户可以通过它选择本地文件进行上传。...

    Struts2实现文件上传

    Struts2是一个强大的MVC框架,广泛应用于Java Web开发中,尤其在处理用户表单提交和文件上传等交互场景中表现出色。在这个“Struts2实现文件上传”的主题中,我们将深入探讨如何利用Struts2框架来实现在Web应用中的...

    完整struts2文件上传示例

    在Struts2中,我们首先需要在`struts.xml`配置文件中添加相关的拦截器(interceptor)来处理文件上传。`struts.multipart.parser`属性应设置为`jakarta`,这是Struts2处理文件上传的方式。例如: ```xml ...

    struts2中的文件上传和下载

    在Struts2中可以通过配置文件上传拦截器(`fileUpload`)来实现对上传文件的大小限制以及文件类型的过滤。在`struts.xml`配置文件中添加如下配置: ```xml &lt;interceptor-ref name="fileUpload"&gt; ...

    struts2文件上传与下载

    首先,我们需要在`struts.xml`配置文件中添加相关的拦截器,以便Struts2能够处理文件上传请求。通常,我们会使用`fileUpload`拦截器: ```xml &lt;package name="default" namespace="/" extends="struts-default"&gt; ...

    struts2s上传文件

    2. **struts.xml配置**:在Struts2的配置文件中,我们需要为文件上传操作指定一个`&lt;action&gt;`元素,并配置`&lt;interceptor-ref&gt;`以包含`params`和`fileUpload`拦截器。这两个拦截器负责解析`multipart/form-data`请求并...

    struts2.1.3上传文件

    在Struts2.1.3中,我们可以使用`struts2-convention-plugin`或者`struts2-core`中的`FileUploadInterceptor`拦截器来处理文件上传。 首先,你需要在Struts2配置文件(通常为struts.xml)中启用文件上传支持,这通常...

    struts2文件上传

    - 使用Struts2的`@FileUpload`注解或在struts.xml中配置文件上传拦截器(`struts.multipart.parser`)。 3. **多文件上传**: - 多文件上传需要使用`List&lt;File&gt;`或者`File[]`类型的字段。每个文件对应的文件名也...

    struts2文件上传,一直报类型不允许的问题

    总的来说,解决“类型不允许的问题”需要对Struts2的配置、拦截器、Action类和文件处理有深入的理解。通过仔细分析`struts2文件上传类型规则表.txt`,并适当调整配置,你就能成功解决这个问题。同时,为了增强系统的...

    Struts2全注解方式实现文件上传与下载

    在本资源中,我们将探讨如何利用Struts2的注解方式来实现文件的上传和下载功能,这对于任何Web应用来说都是至关重要的特性。 首先,我们来看“注解”在Struts2中的作用。Struts2允许开发者使用注解来配置Action类,...

    Struts2文件上传

    Struts2是一个基于MVC(Model-View-Controller)设计模式的开源Java Web框架,它简化了开发过程,提供了强大的拦截器机制和丰富的结果类型。在处理文件上传时,Struts2利用其Action类和配置文件来定义处理上传请求...

    Struts2框架整合Spring框架在文件上传下载中的应用基于HT T P 传输协议, 采用Struts2 框架整合Spring 框架技术对Web 中文件的上传下载进

    Struts2的核心设计采用了拦截器(Interceptor)模式,这使得它可以轻松地扩展和定制,同时也具备了更好的性能。 ##### 2.2 Struts2的体系结构 Struts2的体系结构以拦截器为核心,用户的业务逻辑控制器为目标。当...

Global site tag (gtag.js) - Google Analytics