要實現Struts2框架的文件上傳,需要用到2個jar包
- commons-fileupload-1.2.2.jar
- commons-io-2.0.1.jar
由於文件解析Struts2內部已經幫我們做好了,大大降低了開發難度,我們只需要在Action里設置好對應的參數,目錄進行使用即可。
來個小示例:
upload.jsp
這個頁面的表單有三點需要注意的:
1、表單必須使用post方式提交 2、表單編碼類型 enctype="multipart/form-data" 3、<s:file label="上傳文件:" name="upload"></s:file> name屬性必須要寫
1 <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> 2 <%@ taglib prefix="s" uri="/struts-tags" %> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 7 <title>上傳文件示例</title> 8 </head> 9 <body> 10 <s:actionerror/> 11 <s:fielderror/> 12 <s:form action="upload.action" theme="simple" namespace="/" method="post" enctype="multipart/form-data"> 13 <s:file label="上傳文件:" name="upload"></s:file> 14 <s:submit value="提交上傳"></s:submit> 15 </s:form> 16 </body> 17 </html>
UploadAction.java
這里有幾個注意點:
1、三個成員變量的命名是有規范的:
private File upload里的的upoload一樣要和你上傳提交頁面里的name屬性值對應一致
文件類型和文件名命名分別為:頁面name屬性值+ContentType,頁面name屬性值+FileName
2、提供setter方法,以便接收對應的數據
3、定義目標文件存放處,用commons-io-2.0.1.jar包提供的FileUtils工具類把上傳文件復制到指定位置
1 package com.lcw.struts2.upload; 2 3 import java.io.File; 4 import java.io.IOException; 5 6 import org.apache.commons.io.FileUtils; 7 import org.apache.struts2.ServletActionContext; 8 9 import com.opensymphony.xwork2.ActionSupport; 10 11 public class UploadAction extends ActionSupport { 12 //<s:file label="上傳文件:" name="upload"></s:file> 13 private File upload;//命名應該和上傳頁面name屬性值保持一致 14 private String uploadContentType;//屬性值+ContentType 15 private String uploadFileName;//屬性值+FielName 16 17 public void setUpload(File upload) { 18 this.upload = upload; 19 } 20 21 public void setUploadContentType(String uploadContentType) { 22 this.uploadContentType = uploadContentType; 23 } 24 25 public void setUploadFileName(String uploadFileName) { 26 this.uploadFileName = uploadFileName; 27 } 28 29 public String upload() { 30 File destFile = new File(ServletActionContext.getServletContext() 31 .getRealPath("/uploads") 32 + "/" + uploadFileName); 33 try { 34 //工具類 35 FileUtils.copyFile(upload, destFile); 36 } catch (IOException e) { 37 e.printStackTrace(); 38 } 39 return SUCCESS; 40 } 41 }
struts.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 4 "http://struts.apache.org/dtds/struts-2.0.dtd"> 5 <struts> 6 <constant name="struts.devMode" value="true" /> 7 <!-- 全局國際化配置 --> 8 <constant name="struts.custom.i18n.resources" value="messages"></constant> 9 10 <package name="struts2test" extends="struts-default"> 11 <action name="upload" class="com.lcw.struts2.upload.UploadAction" method="upload"> 12 <result name="success">/index.jsp</result> 13 <result name="input">/upload.jsp</result> 14 </action> 15 </package> 16 17 </struts>
看下效果:
到這里基本的上傳操作已經完成了,下面來下關於上傳文件的配置參數:
首先我們打開Struts2的核心包文件:
在這個文件里,我們可以找到一些關於Struts2的常量和默認參數設置
其中我們可以看到2個參數:
①struts.multipart.saveDir --默認的上傳路徑
②struts.multipart.maxSize=2097152 --默認上傳文件的大小
若我們想改變參數設置,我們可以在struts.xml里配置,例如改變上傳文件大小限定..於此類推(這里改變的是全局設定)
1 <constant name="struts.multipart.maxSize" value="200000"></constant>
若我們想對單獨的表單做設定,struts2的攔截器FileUpload有3個屬性可以供我們選擇
①fileUpload.maximumSize: 上傳文件的最大長度(以字節為單位), 默認值為 2 MB
②fileUpload.allowedTypes: 允許上傳文件的類型, 各類型之間以逗號分隔
③fileUpload.allowedExtensions: 允許上傳文件擴展名, 各擴展名之間以逗號分隔
關於參數,我們可以打開struts2的核心包里的struts-default.xml進行查看
我們可以發現fielUpload攔截器處於Struts2默認的攔截棧里,並且可以發現這個攔截棧引用了workflow,調用Action的validate方法,一旦有錯誤返回,重新定位到INPUT頁面
例如:我們保持以上上傳代碼不變,在配置文件的Actin里添加:
1 <interceptor-ref name="defaultStack"> 2 <param name="fileUpload.allowedExtensions">.txt</param> 3 </interceptor-ref>
設置允許上傳文件類型為txt,此時來看看效果:
很明顯,上傳失敗了,也就意味我們的配置文件限制起作用了。
那么關於錯誤信息的回顯
1、 若我們是針對常量做設置,出錯則跳轉input 視圖, 通過 <s:actionError /> 回顯錯誤信息
2、若我們是對fileLoad做設置,出錯則在頁面通過 <s:fieldError /> 回顯錯誤信息
例如上面出現的回顯錯誤信息File extension not allowed,我們可以在struts2的核心jar的struts-messages.properties里找到
其中的{0}{1}{2}{3}參數分別代表upload,"C和C++程序員的Lua快速入門.pdf" ,"upload__689312be_147f80f105d__8000_00000005.tmp" ,application/pdf
我們可以來個國際化覆蓋對應的key值,進行我們想要的回顯信息:
我上傳一個word文件,看下此時的頁面效果:
搞定搞定,寫博客還是蠻累的。。。關於Struts2的多文件上傳請戳這里:http://www.cnblogs.com/lichenwei/p/3928200.html