關於Struts2的文件上傳

要實現Struts2框架的文件上傳,須要用到2個jar包html

  1. commons-fileupload-1.2.2.jar
  2. commons-io-2.0.1.jar

因爲文件解析Struts2內部已經幫咱們作好了,大大下降了開發難度,咱們只須要在Action裏設置好對應的參數,目錄進行使用便可。java

來個小示例:程序員

upload.jspapache

這個頁面的表單有三點須要注意的:app

一、表單必須使用post方式提交  二、表單編碼類型 enctype="multipart/form-data"    三、<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.javajsp

這裏有幾個注意點:工具

一、三個成員變量的命名是有規範的:post

private File upload裏的的upoload同樣要和你上傳提交頁面裏的name屬性值對應一致ui

文件類型和文件名命名分別爲:頁面name屬性值+ContentType,頁面name屬性值+FileName

二、提供setter方法,以便接收對應的數據

三、定義目標文件存放處,用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,此時來看看效果:

很明顯,上傳失敗了,也就意味咱們的配置文件限制起做用了。

那麼關於錯誤信息的回顯

一、 若咱們是針對常量作設置,出錯則跳轉input 視圖, 經過 <s:actionError /> 回顯錯誤信息 

二、若咱們是對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

相關文章
相關標籤/搜索