轉自:http://blog.csdn.net/Mark_LQ/article/details/49822821html
第一步:上傳組件依賴與commons-fileupload-1.3.1.jar和commons-io-2.2.jar。這兩個文件能夠從http://commons.apache.org/
下載或struts解壓縮包中獲取。
第二步:把form表單的enctype設置爲:「multipart/form-data「,以下:java
<form action="/Struts2Study/uploadFile.action" enctype="multipart/form-data" method="post"> 文件:<input name="uploadFile" type="file"><br> <input type="submit" value="上傳文件"> </form>
注:enctype 屬性規定在發送到服務器以前應該如何對錶單數據進行編碼。
默認地,表單數據會編碼爲 application/x-www-form-urlencoded
。就是說,在發送到服務器以前,全部字符都會進行編碼(空格轉換爲 「+」 加號,特殊符號轉換爲 ASCII HEX 值)。linux
屬性值 | 值描述 |
---|---|
application/x-www-form-urlencoded | 在發送前編碼全部字符(默認) |
multipart/form-data | 不對字符編碼。在使用包含文件上傳控件的表單時,必須使用該值。 |
text/plain | 空格轉換爲 「+」 加號,但不對特殊字符編碼。 |
第三步:Action類中添加如下屬性,表單中文件字段的名稱name=」uploadFile」:web
private File uploadFile; // 對應form表單中上傳輸入框的name值 private String uploadFileContentType; // 上傳文件類型ContentType固定寫法 private String uploadFileFileName; // 上傳文件名FileName固定寫法 public String uploadFile() throws IOException { /* * struts2框架已經將上傳的文件臨時保存在uploadFile變量中,當action結束調用後, * 臨時保存的文件就會刪除,因此須要藉助文件工具類保存到磁盤上! */ /* * 獲取上下文(項目)下files目錄的絕對路徑。 * 考慮到:application.getRealPath(path)能夠獲取絕對路徑 * 因此application -> ServletActionContext.getServletContext() */ String pathname = ServletActionContext.getServletContext().getRealPath("/files"); // 若是保存的路徑不存在,則建立 File destDir = new File(pathname); if (!destDir.exists()) { destDir.mkdir(); } // destDir表示parentDir FileUtils.copyFile(uploadFile, new File(destDir, uploadFileFileName)); return "message"; }
第四步:配置struts.multipart.saveDir常量
Struts2中的struts.multipart.saveDir常量主要是用來設置上傳文件的臨時存放地址,而這個參數設置方法的不一樣對應的地址也不一樣。 若是訪問量不是太大,空間足夠,能夠直接使用默認的臨時地址。apache
1.若是沒有設置struts.multipart.saveDir,那麼將默認使用javax.servlet.context.tempdir
指定的地址,javax.servlet.context.tempdir的值是由服務器來肯定的,臨時文件的名稱相似於upload__1a156008_1373a8615dd__8000_00000001.tmp。
2.直接使用絕對地址(Linux爲例)緩存
<constant name="struts.multipart.saveDir" value="/var/upload_temp_files"/>
第五步:設置可上傳文件的大小限制
默認上傳文件的最大值爲 2097152字節,2M,若是上傳的文件超過,則會報錯。修改最大上傳文件的大小:服務器
<constant name="struts.multipart.maxSize" value=「10701096"/>
Struts2提供類一個文件上傳的攔截器fileUpload,經過配置該攔截器能夠實現上傳文件的過濾。打開該攔截器所對應的類FileUploadInterceptor:app
public class FileUploadInterceptor extends AbstractInterceptor { protected Long maximumSize; protected Set<String> allowedTypesSet = Collections.emptySet(); protected Set<String> allowedExtensionsSet = Collections.emptySet(); ... }
可知配置fileUpload攔截器有3個參數:框架
- maximumSize:容許上傳文件的大小限制,字節爲單位
- allowedTypes:容許上傳的文件類型,多個文件類型採用,分隔
- allowedExtensions:容許上傳文件的後綴名dom
當文件過濾失敗後,添加錯誤信息到系統fildError域,轉入到input視圖,所以該action須要提供input視圖。爲了保證攔截器能夠添加錯誤信息,action須要實現ValidationAware接口,能夠直接基礎ActionSupport類。
(1)攔截器的配置以下:
<action name="uploadFile" class="com.markliu.day04.UploadFileAction" method="uploadFile"> <interceptor-ref name="fileUpload"> <param name="maximumSize">1024</param> <param name="allowedTypes">image/bmp,image/jpg,image/png</param> <param name="allowedExtensions">.bmp,.jpg,.png</param> </interceptor-ref> <interceptor-ref name="defaultStack" /> <result name="message">/pages/day04/message.jsp</result> <result name="input">/pages/day04/uploadfile.jsp</result> </action>
注意:fileUpload攔截器必須在defaultStack(默認)攔截器前面配置,Struts2會由上到下執行攔截器。
(2)因爲defaultStack攔截器棧中已經包含fileUpload攔截器,因此配置簡化以下:
<interceptor-ref name="defaultStack"> <param name="fileUpload.maximumSize">1024</param> <param name="fileUpload.allowedTypes">image/bmp,image/jpg,image/png</param> <param name="fileUpload.allowedExtensions">.bmp,.jpg,.png</param> </interceptor-ref>
(3)修改顯示國際化的錯誤信息:
在上傳文件處理的action所在包下建立資源文件:一個是中文ActionName_zh_CN.properties、一個是英文ActionName_en_US.properties。對於中文資源文件,須要特別注意:咱們應使用Myeclipse自帶的MyEclipse properties Editer編輯器來打開此資源文件,並在properties視圖下進行編輯,這樣它會把中文進行編碼(咱們切換到source視圖下能夠看到經編碼後的中文)。 這一步很是重要,不然會出現亂碼。
可提供國際化資源文件的key值(FileUploadInterceptor中可查看)有:
struts.messages.error.uploading - a general error that occurs when the file could not be uploaded struts.messages.error.file.too.large - occurs when the uploaded file is too large struts.messages.error.content.type.not.allowed - occurs when the uploaded file does not match the expected content types specified struts.messages.error.file.extension.not.allowed - occurs when the uploaded file does not match the expected file extensions specified
---------------------
說明:
怎麼獲取文件名稱和文件類型呢?因而找了大量的資料發現:Strut2的Action類直接經過File類型屬性直接封裝了上傳文件的文件內容,但這個File屬性 沒法獲取上傳文件的文件名和文件類型,因此Struts2就直接將文件域中包含的上傳文件名和文件類型的信息封裝到uploadFileName和 uploadContentType屬性中,也就是說Struts2針對表單中名爲xxx的文件域,在對應的Action類中使用3個屬性來封裝該文件域信息:
String uploadFileName;
注意:這個uploadFileName,uploadContentType。若是File 屬性名xxx(private File xxx;) 。那這個必須是xxxFileName, xxxContentType。而後也是分別給set 方法就能夠。
Struts2多文件上傳
頁面:
![](http://static.javashuo.com/static/loading.gif)
jsp頁面中:
<a href="fileDownload.action?fileName=aa11.jpg">下載文件</a>
配置Struts文件:
<action name="fileDownload" class="com.cn.action.FileOperAction" method="getDownloadFile">
<result name="success" type="stream">
<!-- 設置contentType類型,並設置響應的編碼類型爲UTF-8 -->
<param name="contentType">application/x-msdownload;charset=UTF-8</param>
<param name="contentDisposition">attachment;fileName="${fileName}"</param>
<param name="inputName">downloadFileAsInputStream</param>
<param name="bufferSize">2048</param>
</result>
</action>
配置說明:
固然這些參數均可以在<result type="stream">
中配置 例如:
Action中:
public void setDownloadFileAsInputStream(InputStream downloadFileAsInputStream) {
DownloadFileAsInputStream = downloadFileAsInputStream;
}
public InputStream getDownloadFileAsInputStream() {
DownloadFileAsInputStream= ServletActionContext.getServletContext().getResourceAsStream("/files/"+fileName);
return DownloadFileAsInputStream;
}
//
public String getDownloadFile(){
return SUCCESS;
}
學習參考:http://blog.csdn.net/leisure_life/article/details/57083523
action也能夠寫以下:
public class DownLoadAction {
private InputStream inputStream;
private String fileName;//文件名隨意
public InputStream getInputStream() {
return inputStream;
}
public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
/** * * @return * @throws Exception * 這裏強調一下:首先,在你的當前工程下先得存在/images這麼個文件夾 * 其次裏面得有一張叫0.bmp的圖片 否則到哪裏去下載(咱們的代碼是要放到服務器上去的) */
public String execute() throws Exception{
fileName = "0.bmp";
inputStream = ServletActionContext.getServletContext().getResourceAsStream("/images/"+fileName);
//設置下載文件名 別整中文哈 我這用的是UUID生成隨機名字
fileName = UUID.randomUUID()+".bmp";
/* //若是實在是須要中文怎麼辦呢 fileName = "帥哥.jpg"; //先用當前編碼將其打散 byte[] bytes = fileName.getBytes("utf-8"); //而後用服務端的編碼組裝起來 fileName = new String(bytes,"ISO-8859-1"); */
return "success"; }}<!-- 指定下載文件的文件類型,默認爲text/plain --> <param name="contentType">Application/pdf</param> <!-- 指定由getDownloadFileAsInputStream()方法返回被下載文件的InputStream --> <param name="inputName">downloadFileAsInputStream</param> <!-- 下載對話框中顯示下載的文件的名稱 --> <param name="contentDisposition">attachment;fileName="${fileName}"</param> <!-- 指定下載文件的緩衝大小 --> <param name="bufferSize">2048</param> <!-- 是否支持緩存,默認爲true --> <param name="allowCaching">true</param>