Struts2的上傳與下載

轉自:http://blog.csdn.net/Mark_LQ/article/details/49822821html

10.1.1 文件上傳基本案例

  第一步:上傳組件依賴與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"/>

 

10.1.2 攔截器實現上傳文件的過濾

  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個屬性來封裝該文件域信息:
l 類型爲File的xxx屬性:用來封裝頁面文件域對應的文件內容。
l 類型爲String的xxxFileName屬性:用來封裝該文件域對應的文件的文件名。
l 類型爲String的xxxContentType屬性:用來封裝該文件域應用的文件的文件類型。
 
 
jsp頁面
<input type="file" id="upload" name="upload"/>  這個name就是與Action的屬性對應
 
Action類代碼:
    
[java] 
 
      private
 String uploadFileName;  
  •  String uploadContentType;  
  •       setUpload(File upload) {  
  • .upload = upload;  
  •     }  
  •   setUploadFileName(String uploadFileName) {  
  •         .uploadFileName = uploadFileName;  
  •   setUploadContentType(String uploadContentType) {  
  • .uploadContentType = uploadContentType;  
  •     }  
 
 
設置3個屬性。分別給set方法. 這樣子,就可以獲取上傳的文件,文件名,文件類型。
 

注意:這個uploadFileName,uploadContentType。若是File 屬性名xxx(private File xxx;) 。那這個必須是xxxFileName, xxxContentType。而後也是分別給set 方法就能夠。

 

Struts2多文件上傳

頁面:

[html] 
 
 

 

10.2 文件下載

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>
相關文章
相關標籤/搜索