Struts2的文件上傳

以前感覺文件上傳不怎麼會,都是從網上粘貼的代碼就行了,這兩天學習了下Struts2的文件上傳,感覺很好用啊!記錄以便己用。

在JavaEE中的文件上傳需要注意一點的是就是:表單的enctype屬性了。

enctype主要有三種屬性:

1、application/x-www-form-urlencoded:這個是默認的編碼方式,它只處理表單域中的value值,採用這種方式會把表單域中的值處理成URL的形式。

2、multipart/form-data:這種方式會以二進制的方式來處理表單中的數據,它也會把文件域指定的文件封裝到請求參數中去。

3、text/plain:當表單action屬性爲mailto:URL的形式的時候使用它比較方便,它主要是用於直接通過表單發送郵件的情況。

使用Struts2上傳文件主要依賴的組件是common-fileupload.jar和common-io-*.jar,而且在JSP中的文件類型的Input中,在Struts2中相對應着三個屬性值分別爲:文件類型:***,String類型:***FileName,String類型:***ContentType

JSP中表單如下:

	<s:form action="addPic" method="post" enctype="multipart/form-data">
		<s:textfield name="picName" label="圖片名" />
		<s:file name="pic" label="請選擇文件" />
		<s:submit value="提交" />
	</s:form>
提交給Struts2的Action

public class AddPicAction extends ActionSupport {

	private String picName;
	//每個上傳的文件域需要封裝三個字段域
	private File pic;				//對應上傳文件本身
	private String picFileName;		//對應上傳文件的原始名字
	private String picContentType;	//對應上傳文件的類型
	
	@Override
	public String execute() throws Exception{
		//這裏主要是通過IO流實現文件的讀寫
		String uploadPath = ServletActionContext.getServletContext().getRealPath("/upload");
		String newFileName = UUID.randomUUID().toString()+
				picFileName.substring(picFileName.lastIndexOf("."));
		//打印一下文件保存的路徑
		System.out.println(uploadPath+"/"+newFileName);
		//IO輸入流通過FileInputStream將文件從盤中讀進來
		FileInputStream is = new FileInputStream(pic);
                //通過FileOutputStream將文件寫到我們要保存的路徑下
                FileOutputStream os = new FileOutputStream(uploadPath +"/"+newFileName);
		
		byte[] buff = new byte[1024];
		int len = 0;
		while((len = is.read(buff))>0){
			os.write(buff, 0, len);
		}
		is.close();
		os.close();
		
		return SUCCESS;
	}
        //這裏字段的setter和getter方法就省略啦!
 }

之後通過struts2的配置文件跳轉到相應的頁面就行了,然後還需要對上傳文件進行過濾,肯定不能讓什麼文件都能上傳,那樣相當不安全吧!

Struts2給我們提供了一個fileUpload攔截器,使用相當方便,我只需要在Strtus2的配置文件中引入相應的攔截器就行了:如下:

<action name="addPic" class="struts2.AddPicAction">
       		<interceptor-ref name="fileUpload">
       			<!-- 設置允許上傳的文件類型 -->
       			<param name="allowedTypes">image/jpeg,image/png,
       				image/gif,image/pjpeg</param>
       			<!-- 設置允許上傳文件的大小爲:20K -->
       			<param name="maximumSize">20000</param>
       		</interceptor-ref>
       		<!-- 還需要系統默認的攔截器 -->
       		<interceptor-ref name="defaultStack" />
       		<result name="input">upload.jsp</result>
       		<result>success.jsp</result>
       </action>

這個地方注意的一點是引入了fileUpload攔截器之後,系統默認的攔截器就不起作用了,這時還需要我們手動的把defaultStack引入進去。

如果上傳文件不符合我們要求的就會報錯,系統會默認提示錯誤,但是那都是英文的,對於我們使用漢語的來說不是一件好事啊!所以我們需要把英文轉換成漢語,我需要建一個國際化文件比如:message_zh_CN.properties我們可以把報錯的信息寫進去:

struts.messages.error.content.type.not.allowed是提示文件不是允許的類型

struts.messages.error.file.too.large是提示文件太大

struts.messages.error.uploading是提示未知錯誤

這樣攔截器就完成了!



發佈了36 篇原創文章 · 獲贊 20 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章