Struts2实现文件上传(单文件---更新中)

    Struts2实现文件上传:Struts2框架使用一个fileupload的interceptor来完成文件上传。(这里使用自带的commons-io-2.2.jar提供的FileUtils的copyFile()实现上传)

    三个表单:

浏览器端注意事项:
表单提交方式method=post
表单中必须有一个<input type=”file”>组件
表单中必须设置enctype=”multipart/form-data”

    三个变量:

private File upload; //上传的文件
private String uploadContentType; //上传文件的mimeType类型
private String uploadFileName;//上传文件的名称

单文件上传界面:

upload.jsp

	<form action="${pageContext.request.contextPath }/up" method="post" enctype="multipart/form-data">
		<input type="file" name="upload">
		<input type="submit" value="上传">
	</form>

多文件上传界面

uoloadLot.jsp

	<form action="${pageContext.request.contextPath }/upLot" method="post" enctype="multipart/form-data">
		<input type="file" name="upload"><br />
		<input type="file" name="upload">
		<input type="submit" value="上传">
	</form>

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>
	<!-- 声明常量 -->
	<!-- 可以帮助我们解决post请求乱码问题 -->
	<constant name="struts.i18n.encoding" value="UTF-8"></constant> 
	<!-- 配置这项后,它会提供更加详细报错信息,以及在struts.xml文件修改后不在需要重启服务器(推荐开启) -->
	<constant name="struts.devMode" value="true"></constant>
        <!-- 引入文件上传upload.xml -->
        <include file="upload.xml"></include>
</struts>

upload.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>

    <package name="upload" namespace="/" extends="struts-default">
    <!-- 自定义拦截器栈 -->
    <interceptors>
        <interceptor-stack name="myStack">
            <interceptor-ref name="fileUpload">
                <!-- 设置每一个action允许的上传文件大小 2M:(2097152) -->
                 <param name="maximumSize">209715200</param>  
                <!-- 设置上传允许的文件的mimeType类型,多个使用逗号分开  -->
                <!-- <param name="allowedTypes"></param> --> 
                <!-- 设置上传文件允许的后缀名,多个使用逗号分开 -->
                <!-- <param name="allowedExtensions">bmp,txt</param> --> 
            </interceptor-ref>
            <!-- 引用Struts2默认拦截器,引用自定义拦截器后系统不加载Struts默认拦截器,需要手动加载 -->
            <interceptor-ref name="defaultStack" />
        </interceptor-stack>
    </interceptors>
    
        <!-- 单文件上传 -->
        <action name="up" class="com.it.struts2.upload.action.UploadAction" method="uploadFile">    
            <!-- 出现自带拦截器发生的异常,会跳转到input视图界面提示错误,也有时候会提示连接被重置,这是tomcat的一种机制,本文提供了解决方案 -->        
            <result name="input">/error.jsp</result>
            <!-- 引入自定义拦截器栈 -->
            <interceptor-ref name="myStack" />
        </action>
        <!-- 多文件上传 -->
        <action name="upLot" class="com.it.struts2.upload.action.UploadActionLot" method="uploadLot">
            <result name="input">/error.jsp</result>
            <!-- 引入自定义拦截器栈 -->
            <interceptor-ref name="myStack" />
        </action>
        
    </package>
</struts>

UploadAction.java(单文件上传)

package com.it.struts2.upload.action;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport{
	private File upload; //上传的文件
	private String uploadContentType; //上传文件的mimeType类型
	private String uploadFileName;//上传文件的名称
	public File getUpload() {
		return upload;
	}
	public void setUpload(File upload) {
		this.upload = upload;
	}
	public String getUploadContentType() {
		return uploadContentType;
	}
	public void setUploadContentType(String uploadContentType) {
		this.uploadContentType = uploadContentType;
	}
	public String getUploadFileName() {
		return uploadFileName;
	}
	public void setUploadFileName(String uploadFileName) {
		this.uploadFileName = uploadFileName;
	}
	
	//上传文件的方法
	public void uploadFile() throws Exception{
		String path = ServletActionContext.getServletContext().getRealPath("/upload"); //得到upload目录在tomcat的绝对磁盘路径
		//创建一个服务器端文件
		File dest = new File(path, uploadFileName);
		try {
			//完成文件上传操作(调用copyFile方法)
			FileUtils.copyFile(upload, dest);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

UploadActionLot.java(多文件上传)

package com.it.struts2.upload.action;

import java.io.File;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class UploadActionLot extends ActionSupport {
	private File[] upload;
	private String[] uploadContentType;
	private String[] uploadFileName;

	public File[] getUpload() {
		return upload;
	}

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

	public String[] getUploadContentType() {
		return uploadContentType;
	}

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

	public String[] getUploadFileName() {
		return uploadFileName;
	}

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

	// 上传文件
	public void uploadLot() {
		String path = ServletActionContext.getServletContext().getRealPath("/upload"); // 获得upload在tomcat下的绝对路径
		try {
			for (int i = 0; i < upload.length; i++) {
				// 创建一个服务器端文件
				File dest = new File(path, uploadFileName[i]);
				// 完成文件上传
				FileUtils.copyFile(upload[i], dest);
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

默认拦截器出现异常或者错误的时候跳转的input界面:error.jsp

error.jsp

<body>
	<s:actionerror />
	<s:fielderror />
</body>

       提示:有时候明明已经设置了错误跳转页面也会出现不跳转input错误视图的情况,网页提示:连接被重置。进行如下设置即可解决。在tomcat的安装目录找到,conf/server.xml修改Connector标签,增加maxSwallowSize="-1"属性。

       总结:Struts2文件上传跟据“三个表单”和“三个变量 ”的原则,使用fileupload的interceptor来完成文件上传。当使用单文件和多文件上传时,可以将拦截器定义为一个拦截器栈(Interceptor-stack)。方便每个action进行引用。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值