`
hdxiong
  • 浏览: 378338 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Struts2实现的多文件上传例子

    博客分类:
  • SSH
阅读更多
文件上传的原理:
表单元素的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/)。利用这两个框架都能很方便的实现文件的上传。

以下是实现的全部代码,仅供参考:

    JAR需求:除了Struts2的基本jar必须之外加入commons-fileupload.jar和commons-io.jar即可!

一、upload.jsp:
<%@ page language="java" contentType="text/html; charset=GB2312"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<html>
	<head>
		<title>多文件上传</title>
	</head>
	<body>
		<font color="red"><s:fielderror /> </font>
		<form action="upload.action" method="POST"
			enctype="multipart/form-data">
			<!-- 设置二个文件域,名字相同 -->
			选择第一个文件:
			<input type="file" name="upload" size="50" />
			<br />
			选择第二个文件:
			<input type="file" name="upload" size="50" />
			<input type="submit" value=" 上传 " />
		</form>
	</body>
</html>

二、struts.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
	<include file="struts-default.xml" />
	<package name="struts-upload" extends="struts-default">
		<action name="upload" class="uploadAction">
			<interceptor-ref name="fileUpload">
				<param name="allowedTypes">
			image/bmp,image/png,image/gif,image/jpeg
				</param>
			</interceptor-ref>
			<interceptor-ref name="defaultStack" ></interceptor-ref>
			<result name="success">/manage/success.jsp</result>
			<result name="input">upload.jsp</result>
		</action>
	</package>
</struts>

三、UploadAction.java:
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;

/**
 * 处理多文件上传的Action类
 * 
 * @authorqiujy
 * @version1.0
 */
public class UploadAction extends BaseAction {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private static final int BUFFER_SIZE = 16 * 10240;

	private String dstPath = null;
	private InputStream in = null;
	private OutputStream out = null;

	/**
	 * 用File数组来封装多个上传文件域对象
	 */
	private File[] upload;
	/**
	 * 用String数组来封装多个上传文件名
	 */
	private String[] uploadFileName;
	/**
	 * 用String数组来封装多个上传文件类型
	 */
	private String[] uploadContentType;
	/**
	 * 保存上传的文件(spring注入)
	 */
	private String saveFilesDir;
	/**
	 * 保存上传的图片(srping注入)
	 */
	private String saveImageDir;

	public void setUpload(File[] upload) {
		this.upload = upload;
	}

	public void setUploadFileName(String[] uploadFileName) {
		this.uploadFileName = uploadFileName;
	}

	public void setUploadContentType(String[] uploadContentType) {
		this.uploadContentType = uploadContentType;
	}

	public void setSaveFilesDir(String saveFilesDir) {
		this.saveFilesDir = saveFilesDir;
	}

	public void setSaveImageDir(String saveImageDir) {
		this.saveImageDir = saveImageDir;
	}

	// 自己封装的一个把源文件对象复制成目标文件对象
	private void copy(File src, File dst) throws Exception {
		try {
			in = new BufferedInputStream(new FileInputStream(src), BUFFER_SIZE);
			out = new BufferedOutputStream(new FileOutputStream(dst),
					BUFFER_SIZE);
			byte[] buffer = new byte[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) {
				in.close();
			}
			if (null != out) {
				out.close();
			}
		}
	}

	public String execute() throws Exception {
		// 处理每个要上传的文件
		for (int i = 0; i < upload.length; i++) {
			if (uploadFileName[i].length() != 0) {
				// 根据服务器的文件保存地址和原文件名创建目录文件全路径
				if (uploadContentType[i].startsWith("image")) {
					dstPath = ServletActionContext.getServletContext()
							.getRealPath(saveImageDir + uploadFileName[i]);
				} else {
					dstPath = ServletActionContext.getServletContext()
							.getRealPath(saveFilesDir + uploadFileName[i]);
				}
				if (upload[i] != null)
					copy(upload[i], new File(dstPath));
			}
		}
		return SUCCESS;
	}
}


注意:页面中上传标签<s:file name="xxx" />对应Action类里面的xxx、xxxContentType和xxxFileName三个属性。

四、web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	<!-- 配置struts2 -->
	<filter>
		<filter-name>struts-cleanup</filter-name>
		<filter-class>
		org.apache.struts2.dispatcher.ActionContextCleanUp
		</filter-class>
	</filter>
	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>
		org.apache.struts2.dispatcher.FilterDispatcher
		</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts-cleanup</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<!-- 加载spring配置文件 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/spring-configs/config-*.xml</param-value>
	</context-param>
	<!-- 配置spring监听器 -->
	<listener>
		<listener-class>
	org.springframework.web.context.ContextLoaderListener
		</listener-class>
	</listener>
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
</web-app>

注意:两个filter-mapping的顺序不要颠倒了!

五、在struts.properties中设置上传参数:
##### temporary directory #####
struts.multipart.saveDir=C\:/temp
##### default(CommonsFileUpload) #####
#struts.multipart.parser=
##### default(2M) #####
struts.multipart.maxSize= 10485760

六、在message_zh_CN.properties中设置错误消息:
struts.messages.error.uploading=上传文件失败!
struts.messages.error.file.too.large=上传文件太大!
struts.messages.error.content.type.not.allowed=赞不支持该格式上传!

注意:该错误消息必须写在国际化中才有效!
分享到:
评论

相关推荐

    struts2实现多文件上传下载

    网上的Struts2进行的文件下载一般都是单文件或者固定的文件,并没有(很少)实现随意文件的下载的例子 提供多文件上传,上传成功后,提供刚上传的文件下载功能(其他的都可以在其上面进行扩充) 多文件 上传 下载...

    Struts2多个文件上传

    首先,要实现Struts2的文件上传,必须引入必要的依赖库。主要需要两个Apache Commons库:`commons-fileupload-1.2.2.jar`和`commons-io-2.0.1.jar`。这两个库提供了文件上传的基础功能,使得Struts2能够处理`...

    用Struts框架实现多文件上传功能(初学者的入门项目案例)

    在本项目中,我们将学习如何利用Struts框架实现多文件上传的功能,这对于初学者来说是一个很好的实践项目,能够帮助理解和掌握Struts的核心概念。 首先,了解文件上传的基本原理。在Web应用中,文件上传通常涉及到...

    struts2的实现文件上传的例子

    在这个“struts2的实现文件上传的例子”中,我们将深入探讨如何利用Struts2框架来实现文件上传功能,并将其与MySQL数据库集成。 首先,我们需要在Struts2项目中配置Action类,这个类将负责处理文件上传请求。在...

    Struts2多文件上传下载实例

    在实际项目中,文件上传和下载功能是必不可少的,本实例将详细讲解如何在Struts2框架下实现单个文件及多个文件的上传与下载。 首先,我们需要在Struts2的配置文件(struts.xml)中添加相关的Action配置,以便处理文件...

    struts实现任意多文件上传实例

    总的来说,"struts实现任意多文件上传实例"是一个实用的示例,可以帮助开发者了解和掌握在Struts中进行多文件上传的完整流程。通过学习这个实例,你可以更深入地理解Struts框架和文件上传的处理方式。

    Extjs+Struts2实现异步文件上传

    网上有些这样的例子,但是下了几个都没有跑起来,哎,希望那些发文章的人要发就发全的,别发个半生不熟的。... 现在自己整理了一个Struts2+ExtJS2实现文异步文件上传,没法上传图片无法看到效果,直接上源码吧。

    一个Struts1多文件上传实例(附Form中传List示例)

    本实例主要探讨如何在Struts1中实现多文件上传功能,并结合Form中传递List类型的数据,这对于理解MVC模式下的文件处理和数据传递有重要作用。我们将深入讨论以下几个关键知识点: 1. **Struts1框架基础**: Struts...

    struts2异步多文件上传和下载

    在"struts2异步多文件上传和下载"的例子中,我们将探讨如何利用Struts2的特性来实现实时的、多文件上传以及带有进度条的单文件上传。 首先,文件上传在Web开发中是一项常见的需求,Struts2通过ActionContext类和...

    struts2实现文件上传(单个+多个文件上传

    ### Struts2实现文件上传(单个+多个文件上传) #### 一、单个文件上传 在Struts2框架中实现文件上传是一项常见的需求。本文将详细介绍如何在Struts2中实现单个文件的上传。 ##### JSP 页面设计 首先,我们需要在...

    struts2文件上传例子.rar

    在“struts2文件上传例子.rar”这个项目中,开发者已经使用Struts2.0框架实现了一个简单的文件上传功能。MyEclipse 6.6是一个集成开发环境,支持Java EE项目开发,可以直接导入该项目进行运行和调试。 首先,我们...

    struts1实现的文件批量上传

    在Struts1中实现文件上传,我们需要考虑前端的HTML表单、ActionForm、Struts配置文件以及后台的Action处理。 首先,前端实现是通过一个支持多文件选择的HTML表单来完成的。表单需要设置`enctype="multipart/form-...

    struts2文件上传实例

    在Struts2框架下实现文件上传,主要涉及到以下几个核心概念和技术点: 1. **.struts2配置**:在Struts2框架中,需要在`struts.xml`配置文件中添加相应的action配置,声明文件上传的处理方法。通常,你需要设置`...

    struts2实例 自定义过滤器 文件上传下载 登录功能

    本实例展示了如何在Struts2环境中实现几个关键功能:自定义过滤器、文件上传下载以及用户登录功能。这些功能是任何Web应用程序的基础组成部分,理解和掌握它们对于提升Web开发技能至关重要。 首先,我们来探讨...

    struts2_uploadify带进度条的多文件上传下载

    总之,这个项目实例为使用Struts2和Uploadify实现带进度条的多文件上传及下载功能提供了一个基础模板,对于学习和实践此类功能的开发者来说是一个有价值的参考。通过深入研究和理解这个项目的代码,可以提升对Struts...

    uploadify3与struts2结合实现有进度条文件上传实例

    这是根据uploadify3 2结合struts2搭建的文件上传环境 可以直接导入eclipse运行 每步实现基本都加了注释 以下是我碰到的问题: 1 判断session是否失效 本实例没测试这个问题 但在工作项目中碰到了 但原因在这里...

    struts2 +jquey uploadify3.2 实现多文件上传

    struts2 +jquey uploadify3 2 实现多文件上传 可以运行的myeclipse工程 绝对好用 访问方式http: 127 0 0 1:8080 Struts2Uploadify upload jsp uploadify 使用说明: &lt;a href &quot;javascript:$ &quot;#file ...

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

    Struts2是一个强大的Java web框架,它为开发者提供了丰富的功能,包括文件上传和下载。...以上就是Struts2中文件上传和下载的基本实现步骤和相关知识点。在实际开发中,可能还需要根据具体需求进行相应的优化和扩展。

    struts2文件上传下载实例

    在“struts2文件上传下载实例”中,我们将探讨如何在Struts2框架下实现文件的上传和下载功能,这对于许多Web应用程序来说是必不可少的特性。 首先,`pom.xml`文件是Maven项目对象模型的配置文件,它定义了项目的...

    文件上传struts2实现实例

    本实例将详细讲解如何在Struts2框架下实现文件上传,涵盖单文件和多文件上传的场景。 首先,理解文件上传的基本原理。在Web应用中,用户通过表单提交文件时,浏览器会将文件内容编码成二进制流,并将其封装在HTTP...

Global site tag (gtag.js) - Google Analytics