Struts2文件上传的简单示例

1. 新建一个Struts2应用,注意要将commons-fileupload-1.3.jar和commons-io-2.0.1.jar这两个jar包复制到WEB-INF\lib目录下。


2. 简单的文件上传页面index.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<title>文件上传</title>
	</head>
	<body>
		<!-- 必须将表单的 method设置为post,enctype设置为multipart/form-data,
		 	   浏览器才会把用户选择的文件的二进制数据发送给服务器 -->
		<s:form action="uploadAction" method="post" 
		enctype="multipart/form-data">
			<s:textfield name="title" label="文件标题"/><br/>
			<!-- 文件域 -->
			<s:file name="upload" label="选择文件"/><br/>
			<s:submit value="上传"/>
		</s:form>
	</body>
</html>

3. 用于处理文件上传的UploadAction:

package com.huey.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

/**
 * UploadAction,用户处理文件上传
 * @version 2013-08-20
 * @author Huey2672
 *
 */
public class UploadAction extends ActionSupport {

	/**
	 * 
	 */
	private static final long serialVersionUID = 5288901795536794634L;

	private String title;
	// upload封装了表单中的文件域,其类型为java.io.File
	private File upload;
	// uploadFileName封装了文件upload的文件名
	private String uploadFileName;
	// uploadContentType封装了文件upload的文件类型
	private String uploadContentType;
	// savePath属性通过配置文件struts.xml设置
	private String savePath;
	
	public String getTitle() {
		return title;
	}
	
	public void setTitle(String title) {
		this.title = title;
	}
	
	public File getUpload() {
		return upload;
	}
	
	public void setUpload(File upload) {
		this.upload = upload;
	}
	
	public String getUploadFileName() {
		return uploadFileName;
	}
	
	public void setUploadFileName(String uploadFileName) {
		this.uploadFileName = uploadFileName;
	}
	
	public String getUploadContentType() {
		return uploadContentType;
	}
	
	public void setUploadContentType(String uploadContentType) {
		this.uploadContentType = uploadContentType;
	}
	
	/**
	 * 获取上传文件的保存路径
	 * @return
	 * @throws Exception
	 */
	public String getSavePath() throws Exception {
		return ServletActionContext.getServletContext()
			.getRealPath("/WEB-INF/" + savePath);
	}
	
	public void setSavePath(String savePath) {
		this.savePath = savePath;
	}
	
	@Override
	public String execute() throws Exception {
		// 以服务器上传文件的保存目录和文件名创建输出流
		FileOutputStream fos = new FileOutputStream(getSavePath() + 
				"\\" + getUploadFileName());
		// 以上传的文件创建输入流
		FileInputStream fis = new FileInputStream(getUpload());
		
		byte[] buffer = new byte[1024];
		int len = 0;
		while ((len = fis.read(buffer)) > 0) {
			fos.write(buffer, 0, len);
		}
		
		// 关闭输入输出流
		fis.close();
		fos.close();
		
		return SUCCESS;		
	}
}

4. 配置struts.xml文件,配置了国际化资源,实现文件过滤的拦截器还有UploadAction:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>

	<constant name="struts.custom.i18n.resources" value="msg"/>
	<!-- 指定Struts2文件上传过程中的临时文件夹 -->
	<constant name="struts.multipart.saveDir" value="D:\\apache-tomcat-6.0.36\\webapps\\UploadingDemo\\WEB-INF\\upload\\tmp"/>
	
	<package name="loadup" extends="struts-default">
		<action name="uploadAction" class="com.huey.action.UploadAction">
			<!-- 通过fileUpload拦截器实现文件过滤,
				  当文件过滤失败后,系统将转如input逻辑视图 -->
			<interceptor-ref name="fileUpload">
				<!-- 配置允许上传的文件类型 -->
				<param name="allowedTypes">image/png,image/gif,image/jpeg,image/jpg</param>
				<!-- 配置允许上传的文件大小,单位是字节 -->
				<param name="maximumSize">2048</param>
			</interceptor-ref>
			<!-- 还必须显示配置Struts默认的拦截器,且fileUpload配置在前 -->
			<interceptor-ref name="defaultStack"/>
			<param name="savePath">/upload</param>
			<result name="success">success.jsp</result>
			<result name="input">index.jsp</result>
		</action>
	</package>

</struts>

5. 当文件过滤失败后,跳转回index.jsp视图后,Struts2的标签会自动显示上传失败的提示信息,但是提示的英文信息,上传文件类型不允许和上传文件太大的提示信息的key分别是struts.messages.error.content.type.not.allowed和struts.messages.error.file.too.large,可以在自己的国际化资源文件中增加该key的消息,以改变提示信息。国际化资源文件msg_zh_CN.properties(需要要native2ascii工具处理):

struts.messages.error.content.type.not.allowed=只能上传图片!请重新选择!
struts.messages.error.file.too.large=上传的文件太大,请重新选择!

6. 文件上传成功的视图success.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<title>上传成功</title>
	</head>
	<body>
		上传成功!
	</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值