1. 程式人生 > >Struts2學習筆記整理(四)

Struts2學習筆記整理(四)

配置 lin 彈出 ons cut htm servlet onf tdi

Struts2上傳下載

文件上傳

如果想使用HTML表單上傳文件(一個或多個),那麽必須把HTML表單的enctype屬性設置成multipart/form-data,且method=post, 且使用<input type="file">.

在Struts裏,我麽使用FileUpload攔截器和 Jakarta Commons FileUpload 組件可以完成文件的上傳.

步驟:1.在jsp中使用file標簽,如果上傳一個文件就寫一個,多個文件的話使用多個file標簽,但是它們的名字相同.

2.在action中添加3個和文件上傳相關的屬性 且格式固定

private
File uploadImage; //上傳的文件 private String uploadImageContentType; //上傳的文件的類型 private String uploadImageFileName; //上傳文件的名稱

其中 uploadImage是jsp頁面file的名字 <input type="file" name="uploadImage">

如果是上傳單個文件, uploadImage屬性的類型就是 java.io.File, 它代表被上傳的文件, 第二個和第三個屬性的類型是 String, 它們分別代表上傳文件的文件名和文件類型 定義方式是分別是jsp頁面file組件的名稱+ContentType,jsp頁面file組件的名稱+FileName

如果上上傳多個文件, 可以使用數組或 List

一.單文件的上傳

  1. 首先需要導包 commons-fileupload-1.2.1.jar,commons-io-1.3.2.jar
  2. 把form表單的ectype屬性設置成multipart/form-data method設置成post 代碼如下
    <form action="${pageContext.request.contextPath}/upload/uploadAction_saveFile.action"  
              name="form1"  method="post"  enctype="multipart/form-data" >
                 上傳文件名稱:
    <input type="file" name="uploadImage"> <input type="submit" value="上傳"> </form>

  3. 在action表單中添加如下屬性,且文件名字必須與表單中字段對應

    public class UploadAction{
    private File uploadImage;//得到上傳的文件

    private String uploadImageContentType;//得到文件的類型

    private String uploadImageFileName;//得到文件的名稱

     //這裏略省了屬性的getter/setter方法
    public String saveFile() throws Exception{

    /**servletContext提供了標準的Servlet運行環境,其實就是一些servlet和web 容器進行通信的方法。

    ServletActionContext 其實是ActionContext的子類,其功能脫胎於ActionContext,對ActionContext的方法做了一定的包裝,提供了更簡便直觀的方法。

    ActionContext來源於Struts2,ActionContext就是為了彌補strtus2 action跳出標準servlet框架而造成的和WEB環境失去聯系的缺陷。 */

    ServletContext sc = ServletActionContext.getServletContext();

    String realpath = sc.getRealPath(“/uploadfile”); //目標路徑 存儲到哪裏

    try {

    File destFile = new File(realpath, uploadImageFileName);//在目標路徑下創建文件

    FileUtils.copyFile(uploadImage, destFile);//將文件拷貝到目標文件中 uploadImage-->destFile

    } catch (IOException e) {

    e.printStackTrace();

    }

    return "success";}}


    值得註意的是我這裏的目標路徑是肯定存在的,如果開發中我們要進行判斷是不是存在,不存在則創建.

  4. 設置上傳文件的最大值在struts.xml文件加載該資源文件

       <!-- 設置comonFileupload上傳組件允許的文件大小 才能測試出上傳文件過大出現的錯誤信息 
             默認值是2M-->
       <constant name="struts.multipart.maxSize" value="86170804"/>

5.在struts.xml文件中增加如下配置

 <package name="upload" namespace="/upload" extends="struts-default" >
          <!-- 單文件上傳 -->
        <action name="uploadAction_*" class="cn.itcast.upload.UploadAction" method="{1}">
           <result name="success">/upload/success.jsp</result>
   
           <!-- 定義上傳出錯要轉向的頁面 -->
           <result name="input">/upload/error.jsp</result>
       </action>
 <package>

File Upload 攔截器

  • File Upload攔截器負責處理文件的上傳操作,它是默認的defaultStack攔截器粘的一員
  • File Upload有三個屬性可以設置 maximumSize:上傳最大長度(單位是字節),默認是2MB allowedTypes:上傳文件的類型 ,用","分割 allowedExtensions:文件擴展名.","分割技術分享圖片
  • 若用戶上傳的文件大小大於給定的最大長度或其內容類型沒有被列在 allowedTypes, allowedExtensions 參數裏, 將會顯示一條出錯消息. 與文件上傳有關的出錯消息在struts-messages.properties 文件裏預定義. (org.apache.struts2包下)
  • 可以在文件上傳 Action 相對應的資源文件中重新定義錯誤消息, 但需要在 struts.xml 文件中配置使用 action 的消息:

在jsp頁面顯示錯誤信息

在struts.xml文件中根據 <result name=“input”>/upload/error.jsp</result>中所指向的error.jsp頁面可以使用<s:fielderror/>顯示錯誤信息

自定義錯誤信息

  1. 創建新的資源文件 例如message_zh_CN.properties,放置在src下在該資源文件中增加如下信息
    struts.messages.error.uploading=上傳錯誤: 
    struts.messages.error.file.too.large=上傳文件太大:
    struts.messages.error.content.type.not.allowed=上傳文件的類型不允許: struts.messages.error.file.extension.not.allowed=上傳文件的後綴名不允許:

  2. 在struts.xml文件加載該資源文件

    <constant name="struts.custom.i18n.resources" value="message"></constant>

    message意思為以message開頭的屬性配置文件,中文的文件名為:message_zh_CN.properties

多文件上傳

多文件上傳和單文件上傳的區別主要在於action的處理

多文件上傳的aciton

public class uploadAction{
  //多文件所以用的是數組的形式
private File[] uploadImages;//得到上傳的文件 private String[] uploadImagesContentType;//得到文件的類型 private String[] uploadImagesFileName;//得到文件的名稱 //這裏略省了屬性的getter/setter方法 public String saveFiles() throws Exception{ ServletContext sc = ServletActionContext.getServletContext(); String realpath = sc.getRealPath("/uploadfile"); try { if(uploadImages!=null&&uploadImages.length>0){ for(int i=0;i<uploadImages.length;i++){ File destFile = new File(realpath,uploadImageFileNames[i]); FileUtils.copyFile(uploadImages[i], destFile); } } } catch (IOException e) { e.printStackTrace();}return "success";}}

文件的下載

  • struts2提供了stream結果類型,該結果類型就是專門用於支持文件下載功能的
  • 指定stream結果類型 需要指定一個 inputName參數,該參數指定一個輸入流,提供被下載文件的入口

DownLoadAction.java

package com.action;

import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class DownloadAction extends ActionSupport{
    private static final long serialVersionUID = 1L;
    //文件路徑
    private String path;
    
    //path屬性的getter方法
    public String getPath(){
        return path;
    }
    //path屬性的setter方法
    public void setPath(String path){
        this.path = path;
    }
    //返回inputstream,文件下載關鍵方法
    public java.io.InputStream getDownloadFile() throws Exception{
        InputStream in = ServletActionContext.getServletContext().getResourceAsStream(getPath());
        return in;
    }
    public String execute() throws Exception{
        return SUCCESS;
    }
}

Struts.xml配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
     <!-- 配置 Struts 2 應用中的常量 --> 
     <constant name="struts.i18n.encoding" value="UTF-8" /> 
         <!-- 配置上傳文件的最大容量,struts2默認為2M。單位是1B, 1KB=1024B,1M=1024KB,1M=1024*1024B-->
         <constant name="struts.multipart.maxSize" value="1048576" />
     
     
     <!-- 配置本應用中的包,繼承 struts-default 包 --> 
     <package name="FileDownload" namespace="/" extends="struts-default"> 
         <action name="download" class="com.action.DownloadAction"> 
             <!-- 設置文件路徑的參數,傳到action類文件中去 -->
             <!-- <param name="path">\download\a.jpg</param> -->
             <!-- 下載文件類型定義,即定義為“stream” -->
             <result name="success" type="stream">
                 <!-- image/jpeg代表JPG圖片 -->
                 <param name="contentType">image/jpeg</param>
                 <!-- 下載文件處理方法 -->
                 <param name="contentDisposition">
                     <!-- attachment表示附件方式,即下載時打開保存對話窗,filename表示下載時顯示的保存時的文件名 -->
                         <!-- 如果不寫attachment;或者是寫的是inline; 則表示內聯,即會在瀏覽器中嘗試打開下載的文件,而不是下載-->
                     attachment;filename="a.jpg"        
                 </param>
                 <!-- 下載文件輸出流定義 -->
                     <!-- 這裏的inputName元素所對應的value值downloadFile,在action中一定要有對應的getDownloadFile()方法 -->
                 <param name="inputName">downloadFile</param>
                 <!-- 下載緩沖區的大小 -->
                 <param name="bufferSize">1024</param>
             </result> 
         </action>
     </package> 
</struts>    

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>首頁</title>
  </head>
  <body>
    <center> 
         歡迎來到首頁,點下面鏈接去下載一個文件<br />
         <a href="download.action?path=<%="./download/a.jpg" %>">下載</a>&nbsp;&nbsp;&nbsp;
    </center>
  </body>
</html>

文件路徑

項目中要提前建立好download目錄,和裏面要存在有a.jpg文件,否則,下載會失敗。

功能入口

項目發布到服務器後,用瀏覽器訪問項目中的index.jsp ,點擊下載鏈接,就可以彈出“下載”對話框。

到此Strtus2文件的上傳和下載我們基本了解了.

Struts2學習筆記整理(四)