Struts2文件上传

一、定义Action类实现文件上传

(1)上传页面html

form表单必须设置enctype="multipart/form-data",提交方式为POST。java

示例:apache

upload.jspapp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>上传文件</title>
</head>
<body>
	<form action="${pageContext.request.contextPath }/fileUploadAction.action" method="post" enctype="multipart/form-data">
		<label>上传文件</label>
		<input type="file" name="file"/><br/>
		<input type="submit" value="提交"/>
	</form>
</body>
</html>

(2)实现文件上传的Action类jsp

Action类中必 须定义三个属性用于封装文件信息,有特定的命名规则,具体查看示例。ide

示例:post

UnifileUploadAction.java(单文件上传)ui

package cn.iborder.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class FileUploadAction extends ActionSupport {
	
	/**
	 * @param file		与表单的file控件的name属性值同样。
	 * @param fileFileName		前缀必须与第一个File类型变量名一致。
	 * @param fileContentType		前缀必须与第一个File类型变量名一致。
	 */
	private File file;		//封装上传文件属性
	private String fileFileName;		//封装上传文件名称
	private String fileContentType;		//封装上传文件MIME类型
	
	private String savePath;
	
	public File getFile() {
		return file;
	}

	public void setFile(File file) {
		this.file = file;
	}

	public String getFileFileName() {
		return fileFileName;
	}

	public void setFileFileName(String fileFileName) {
		this.fileFileName = fileFileName;
	}

	public String getFileContentType() {
		return fileContentType;
	}

	public void setFileContentType(String fileContentType) {
		this.fileContentType = fileContentType;
	}

	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		FileInputStream fin = new FileInputStream(file);
		savePath = ServletActionContext.getServletContext().getRealPath("/upload");
		File upload = new File(savePath);
		if (!upload.exists()) {
			upload.mkdir();
		}
		System.out.println("保存路径"+savePath+"\\"+this.getFileFileName());
		FileOutputStream fon = new FileOutputStream(savePath+"\\"+this.getFileFileName());
		byte[] buffer = new byte[1024];
		int len = 0;
		while ((len = fin.read(buffer))>0) {
			fon.write(buffer, 0, len);
		}
		fin.close();
		fon.flush();
		fon.close();
		return SUCCESS;
	}
}

MultifileUploadAction.java(多文件上传)this

package cn.iborder.action;

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

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class MultifileUploadAction extends ActionSupport {
	
	/**
	 * @param file[]		与表单的file控件的name属性值同样。
	 * @param fileFileName[]		前缀必须与第一个File类型变量名一致。
	 * @param fileContentType[]		前缀必须与第一个File类型变量名一致。
	 */
	private File[] file;		//封装上传文件属性
	private String[] fileFileName;		//封装上传文件名称
	private String[] fileContentType;		//封装上传文件MIME类型
	
	private String savePath;

	public File[] getFile() {
		return file;
	}

	public void setFile(File[] file) {
		this.file = file;
	}

	public String[] getFileFileName() {
		return fileFileName;
	}

	public void setFileFileName(String[] fileFileName) {
		this.fileFileName = fileFileName;
	}

	public String[] getFileContentType() {
		return fileContentType;
	}

	public void setFileContentType(String[] fileContentType) {
		this.fileContentType = fileContentType;
	}

	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		savePath = ServletActionContext.getServletContext().getRealPath("/upload");
		for (int i = 0; i < file.length; i++) {
			FileUtils.copyFile(file[i], new File(savePath, this.getFileFileName()[i]));
		}
		return SUCCESS;
	}
}

(3)配置struts.xmlspa

  • 设置常量struts.multipart.saveDir配置上传文件的临时存文件夹
  • 配置是上传文件的Action类
<?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.devMode" value="true"></constant>
    <!--设置上传文件的临时存放文件夹 -->
	<constant name="struts.multipart.saveDir" value="/tmp"></constant>
	<package name="struts2" extends="struts-default" abstract="false">
		
		<!-- 配置全局结果集,在此package里每一个action共用的结果集 -->
		<global-results>
			<result name="success">/index.jsp</result>
		</global-results>
		<action name="UnifileUpload" class="cn.iborder.action.UnifileUploadAction">
			<result name="success">/index.jsp</result>
		</action>
		<action name="MultifileUpload" class="cn.iborder.action.MultifileUploadAction" >
			<result name="success">/index.jsp</result>
		</action>
	</package>
</struts>

二、配置拦截器对上传文件参数进行过滤

配置拦截器步骤:

(1)struts2定义了文件上传拦截器:fileUpload

(2)设置参数来限制上传文件大小、文件类型,可经过文件后缀名来限制上传文件的类型。

  • maximumSize:表示上传文件大小的上限,单位是byte。默认2MB。
  • allowedTypes:表示容许上传文件的类型,每一个类型之间用逗号分隔开(ie: text/html, image/jpg)。若是没有指定这个参数,则能够接受任何类型的文件。
  • allowedExtensions:表示容许上传以这些后缀结尾的文件,每一个后缀之间用逗号分隔开(ie: .html, .jpg)。若是没有指定这个参数,则能够接受任何类型的文件。

(3)在fileUpload拦截器后,须要添加<interceptor-ref name="defaultStack"/>

示例:

<?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.devMode" value="true"></constant>
	<constant name="struts.multipart.saveDir" value="/tmp"></constant>
	<package name="struts2" extends="struts-default" abstract="false">
		
		<!-- 配置全局结果集,在此package里每一个action共用的结果集 -->
		<global-results>
			<result name="success">/index.jsp</result>
		</global-results>
		<action name="UnifileUpload" class="cn.iborder.action.UnifileUploadAction">
			<interceptor-ref name="fileUpload">
                <param name="allowedTypes">application/msword</param>
                <param name="maximumSize">3</param>
            </interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
			<result name="success">/index.jsp</result>
		</action>
		<action name="MultifileUpload" class="cn.iborder.action.MultifileUploadAction" >
			<interceptor-ref name="fileUpload">  
               <!-- 指定上传文件的大小 -->
	           <param name="fileUpload.maximumSize">6000</param>
	           <!-- 之后缀名指定上传文件的类型 -->
	           <param name="fileUpload.allowedExtensions">.jpg,.png</param>
	           <!-- 以文件类型指定上传文件的类型 -->
	            <param name="fileUpload.allowedTypes">image/png</param>
            </interceptor-ref>  
            <interceptor-ref name="defaultStack"></interceptor-ref>
			<result name="success">/index.jsp</result>
		</action>
	</package>
</struts>
相关文章
相关标签/搜索