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>
相關文章
相關標籤/搜索