struts2文件上传的例子

jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>文件上传</h1>
	<form action="user_register" method="post" enctype="multipart/form-data">
		帐号<input type="text" name="username"><br/>
		文件<input type="file" name="attachment"><br/>
		附件1:<input type="file" name="attach"><br/>
		附件2:<input type="file" name="attach"><br/>
		附件3:<input type="file" name="attach"><br/>
		<input type="submit" value="提交"> 
	</form>
	<s:debug/>
</body>
</html>

Action

需要一个File类型的属性(File的List和数组也可以,支持批量上传),这些File属性指的是上传的临时文件,我们要编程处理这些临时文件。

String类型的属性可以用来获取客户端真是的文件名称(命名规则:参数名+FileName)


package com.zucc.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.ServletContext;

import org.apache.struts2.util.ServletContextAware;

import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport implements ServletContextAware {

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

	private String username;

	// 上传到服务器的临时文件
	private File attachment;

	// 上传的文件的MIME类型
	private String attachmentContenType;

	// 上传的文件的客户端的名称
	private String attachmentFileName;

	private ServletContext application;

	// 时间转换
	private DateFormat df;

	// 保存路径
	private String saveDir;

	private File[] attach;

	private String[] attachFileName;

	public UserAction() {
		this.df = new SimpleDateFormat("yyyyMMdd_HHmmssSS_");
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public File getAttachment() {
		return attachment;
	}

	public void setAttachment(File attachment) {
		this.attachment = attachment;
	}

	public String getAttachmentContenType() {
		return attachmentContenType;
	}

	public void setAttachmentContenType(String attachmentContenType) {
		this.attachmentContenType = attachmentContenType;
	}

	public String getAttachmentFileName() {
		return attachmentFileName;
	}

	public void setAttachmentFileName(String attachmentFileName) {
		this.attachmentFileName = attachmentFileName;
	}

	public ServletContext getApplication() {
		return application;
	}

	public void setApplication(ServletContext application) {
		this.application = application;
	}

	public File[] getAttach() {
		return attach;
	}

	public void setAttach(File[] attach) {
		this.attach = attach;
	}

	public String[] getAttachFileName() {
		return attachFileName;
	}

	public void setAttachFileName(String[] attachFileName) {
		this.attachFileName = attachFileName;
	}

	@Override
	public void setServletContext(ServletContext context) {
		this.application = context;

		// 文件上传到<webAppPath>/upload/
		/**
		 * 初始化文件上传的路径
		 */
		saveDir = application.getRealPath("/upload");
		System.out.println("saveDir:" + saveDir);
		File saveDirFile = new File(saveDir);
		if (!saveDirFile.exists()) {
			saveDirFile.mkdir();
		}
	}

	public String register() throws Exception {
		System.out.println("UserAction register....");
		System.out.println("USername:" + username);
		System.out.println("attachment:" + attachment);
		System.out.println("attachmentContenType:" + attachmentContenType);
		System.out.println("attachmentFileName:" + attachmentFileName);

		if (attachment != null) {
			// 单个文件上传
			this.saveFile(attachment, this.getExtension(attachmentFileName));
		}

		if (attach != null) {
			// 文件批量上传
			for (int i = 0; i < attach.length; i++) {
				System.out.println("attach[" + i + "]:" + attach[i]);
				System.out.println("attachFilename[" + i + "]:"
						+ attachFileName[i]);
				this.saveFile(attach[i], this.getExtension(attachFileName[i]));
			}
		}
		return SUCCESS;
	}

	/**
	 * 保存文件
	 * 
	 * @param file
	 * @param extension
	 * @throws IOException
	 */
	private void saveFile(File file, String extension) throws IOException {
		Date date = new Date();
		int randNum = (int) (Math.random() * 9000 + 1000);
		String saveFileName = df.format(date) + randNum + "." + extension;
		System.out.println("saveFileName:" + saveFileName);

		// 文件拷贝
		FileInputStream fis = new FileInputStream(file);
		FileOutputStream fos = new FileOutputStream(saveDir + "/"
				+ saveFileName);
		byte[] data = new byte[1024 * 20];
		int len = fis.read(data);
		while (len != -1) {
			fos.write(data, 0, len);
			len = fis.read(data);
		}
		fis.close();
		fos.close();
	}

	/**
	 * 获取上传文件的扩展名
	 * 
	 * @param attachmentFileName
	 * @return
	 */
	private String getExtension(String filename) {
		String extension = null;

		// 保存的文件名按照时间进行命名:年月日_时分秒毫秒_随机数
		int lastDotIndex = filename.lastIndexOf('.');
		if (lastDotIndex == -1) {
			extension = "";
		} else {
			extension = filename.substring(lastDotIndex + 1);
		}
		System.out.println("extension:" + extension);
		return extension;
	}

}

struts.xml

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

<struts>
	<constant name="struts.enable.DynamicMethodInvocation" value="true" />
    <constant name="struts.devMode" value="true" />
   <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
   <!-- 本次上传的所有文件的总大小的设置,value为1024*1024*x,x为MB大小,,value不能是表达式 -->
    <constant name="struts.multipart.maxSize" value="2097152"/>
    
 	<package name="default" namespace="/" extends="struts-default">
 	<action name="user_*" class="com.zucc.action.UserAction" method="{1}">
 		<result>/NewFile.jsp</result>
 		<result name="input">/NewFile.jsp</result>
 		<interceptor-ref name="fileUpload">
 			<!-- 对单个文件的大小的设置,值为1024*1024*x,x为MB大小 -->
 			<param name="maximumSize">2097152</param>
 			
 			<!-- 对单个文件的后缀名进行设置,这里只能上传.jpg和.gif格式的文件,两个后缀名用,隔开,不区分大小写 -->
 			<param name="allowedExtensions">.jpg,.gif</param>
 			
 		</interceptor-ref>
 		<interceptor-ref name="basicStack"/>
 	</action>
    </package>
</struts>

注意:当上传的文件超过最大值时(最大值为struts2-core-2.3.28.1.jar的org.apache.struts2的default.properties的struts.multipart.maxSize所等于的值,可以在struts.xml中进行配置),会跳转到result为input所指示的页面,没有的话会报错,可以在struts.xml中设置(<result name="input">/</result>)







1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下 4载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值