Struts2之文件上傳

正式學習文件上傳之前,需要搞清楚一件事,所謂的文件上傳指的就是用戶將本地文件通過某種方式提交到服務器端,然後保存在服務器端主機的某個地方,跟文件下載不同的是,文件下載需要解決的是文件如何從服務器到客戶端,那麼文件上傳正好相反,需要研究客戶端從服務器端的過程,搞清楚這個,問題就好辦多了,另外Struts2中使用{fileupload}攔截器來處理用戶的文件上傳操作,好的看下面的表單:

	<form name="myForm" enctype="multipart/form-data" action="upload" method="post">
		<input type="file" name="myDoc" /> 
		<input type="submit" value="上傳" />
	</form>

文件上傳中,需要採用post方式提交,且將enctype設置爲“multipart/form-data”,另外需要注意輸入項類型爲file的name屬性值爲myDoc,再看處理文件上傳的Action類的配置,

package com.struts2.action;

import java.io.File;

import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport {
	// 用來接收前臺上傳過來的文件信息
	private File myDoc;
	// 上傳文件的MIME類型
	private String myDocContentType;
	// 上傳文件的名稱
	private String myDocFileName;

	@Override
	public String execute() throws Exception {
		return SUCCESS;
	}
	
	public File getMyDoc() {
		return myDoc;
	}

	public void setMyDoc(File myDoc) {
		this.myDoc = myDoc;
	}

	public String getMyDocContentType() {
		return myDocContentType;
	}

	public void setMyDocContentType(String myDocContentType) {
		this.myDocContentType = myDocContentType;
	}

	public String getMyDocFileName() {
		return myDocFileName;
	}

	public void setMyDocFileName(String myDocFileName) {
		this.myDocFileName = myDocFileName;
	}
	
}

一般,我們可以看到提交表單文件上傳輸入項的name屬性值爲myDoc,所以需要在UploadAction裏面提供三個屬性:File類型的myDoc屬性、String類型的myDocContentType屬性、String類型的myDocFileName屬性,一定要記住這幾個屬性的前綴一定要與表單裏面的name屬性值保持一致,否則就無法賦值,切記!!

文件一旦上傳到服務器端被Action類的接收到之後,這個問題就轉化問普通本地的IO流操作了,就可以按照自己的設計將文件放置到任意位置,此時如果你的上傳文件大小超過2M大小,就會拋出異常,這是怎麼回事呢?原因在於Struts2的默認配置中,對文件上傳處理做了些默認配置,因此如果需要,Struts2中支持修改文件上傳的請求解析器、文件存儲的臨時目錄以及文件上傳大小的限制,先看如下Struts2默認配置:

### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data
# struts.multipart.parser=cos
# struts.multipart.parser=pell
# struts.multipart.parser=jakarta-stream
#可以設置文件上傳請求由哪個框架進行解析
struts.multipart.parser=jakarta
# uses javax.servlet.context.tempdir by default
#文件上傳的臨時目錄
struts.multipart.saveDir=
#文件上傳的最大byte數
struts.multipart.maxSize=2097152
我們既可以在src目錄下新建一個struts.properties文件來修改默認設置,

#將文件上傳大小的限制設置爲10M
struts.multipart.maxSize=10485760

也可以在struts.xml中,通過常量的形式修改:

<constant name="struts.multipart.maxSize" value="10485760"/>
好的,說完了單個文件上傳,再來談談批量上傳,批量上傳指的是在一次文件上傳請求中,同時上傳多個文件,這個對於Struts2更是小菜一碟,只需做少量改動,需要將Action的三個屬性分別變爲對應的數組類型即可,看例子:

爲了滿足批量上傳,表單的修改如下:

	<form name="myForm" enctype="multipart/form-data" action="upload" method="post">
		<input type="file" name="myDoc" />
		<input type="file" name="myDoc" /> 
		<input type="file" name="myDoc" /> 
		<input type="submit" value="批量上傳" />
	</form>
struts.xml中的配置無需做任何變動,看Action類的變化,由於要處理批量上傳,所以需要將對應類型變爲數組類型,看配置:

package com.struts2.action;

import java.io.File;

import com.opensymphony.xwork2.ActionSupport;

public class UploadAction2 extends ActionSupport {
	// 用來接收前臺上傳過來的文件信息
	private File[] myDoc;
	// 上傳文件的MIME類型
	private String[] myDocContentType;
	// 上傳文件的名稱
	private String[] myDocFileName;

	@Override
	public String execute() throws Exception {
		return SUCCESS;
	}

	public File[] getMyDoc() {
		return myDoc;
	}

	public void setMyDoc(File[] myDoc) {
		this.myDoc = myDoc;
	}

	public String[] getMyDocContentType() {
		return myDocContentType;
	}

	public void setMyDocContentType(String[] myDocContentType) {
		this.myDocContentType = myDocContentType;
	}

	public String[] getMyDocFileName() {
		return myDocFileName;
	}

	public void setMyDocFileName(String[] myDocFileName) {
		this.myDocFileName = myDocFileName;
	}
	
}
屬性類型變爲數組類型後,毫無疑問每個數組相同索引對應的是同一個上傳文件,上傳的文件可以通過迭代相應的數組進行處理,需要注意的是也可以用List類型來代替數組類型,結果都是一樣;

基本配置如上了,但是另一個問題來了,用戶不能隨便上傳任意大小的任意類型的文件,所以Struts2通過使用fileUpload攔截器對文件上傳大小和類型的限制;

1、首先說說對大小的限制,Struts2中提供了兩種方式對文件大小進行限制,分別爲通過設置struts.multipart.maxSize和fileUpload攔截器的maximumSize屬性進行實現文件大小控制,那麼它倆有什麼區別呢?前者是控制一次上傳請求過程稱,所有上傳文件大小的和,而後者是對上傳文件中每個文件的大小,需要注意這一點,在說說對文件類型的控制,文件類型也是通過fileUpload攔截器進行設置的,下面通過一個配置來設置每個上傳文件的大小以及文件類型的控制:

	<action name="upload" class="com.ognl.action.UploadAction">
		<result name="success">/index.jsp</result>
		<interceptor-ref name="fileUpload">
			<!-- 設置Struts2允許上傳文件的最大比特數 -->
			<param name="maximumSize">5242880</param>
			<!-- 允許上傳文件的MIME類型 -->
			<param name="allowedTypesSet">image/jpeg,image/gif</param>
		</interceptor-ref>
2、設置臨時目錄

由於Struts2框架在將文件正式傳遞到一個Action之前,會首先將文件保存到一個臨時目錄中,默認情況下同javax.servlet.context.tempdir相同路徑,如果想要自主設置該目錄的話,可以在struts.properties文件裏面通過設置struts.multipart.saveDir來改變默認路徑;


好的,文件上傳的內容基本這麼多了,注意與文件下載的不同之處,對比學習就可以,總體而言都比較的簡潔;




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章