1. 程式人生 > >Struts2之文件上傳下載

Struts2之文件上傳下載

Enctype erro 大小 fin 滿足 封裝 動態方法 throws 上傳下載

一、文件上傳

1、上傳文件jsp頁面

表單中enctype 必須為 multipart/form-data,提交方式必須為 post。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP ‘fileupload.jsp‘ starting page</
title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <form action="fileupload_fileUpload.action" enctype="multipart/form-data" method
="post"> <s:if test="fieldErrors[‘upload‘].size()>0"> <s:property value="fieldErrors[‘upload‘][0]"/> </s:if> <!-- 說明上傳成功 --> <s:else> <p> <s:property value="message"/> <!-- 顯示上傳成功的提示信息
--> 文件名:<s:property value="uploadFileName"/> <!-- 顯示上傳文件名 --> 文件類型:<s:property value="uploadContentType"/> <!-- 顯示上傳文件類型 --> </p> </s:else> <p> 上傳者:<input type="text" name="author" class="ipt"> </p> <p> 選擇文件:<input type="file" name="upload" class="ipt"> </p> <p><input type="submit" value="提交"> </p> </form> </body> </html>

2、上傳文件Action

對於name屬性為xxx的文件,Action中需要用File類型的xxx封裝上傳的文件實例,用String類型的xxxFileName封裝文件的名稱,用xxxContent封裝文件的文件類型。

package com.action;

import java.io.File;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class FileUploadAction extends ActionSupport {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private String message; // 提示信息
    private String author; // 上傳者
    //需要提供get set方法才會封裝進值
    private File upload; // Struts2會將上傳成功的文件對象賦值給該屬性
    private String uploadFileName; // 封裝上傳文件的名稱,包括後綴
    private String uploadContentType; // 封裝上傳文件的類型

    
    public String fileUpload() throws Exception {
        // 保存文件的路徑
        String realpath = ServletActionContext.getServletContext().getRealPath("/upload");
        System.out.println("文件路徑" + realpath+"\n"+"文件類型:"+uploadContentType);
        // 未選擇上傳文件就提交的處理
        if (upload != null) {
            File savefile = new File(new File(realpath), uploadFileName);

            // 如果該文件所在目錄不存在,則生成一個目錄
            if (!savefile.getParentFile().exists()) {
                savefile.getParentFile().mkdirs();
            }
            FileUtils.copyFile(upload, savefile);
            
            ActionContext.getContext().put("msg", "上傳文件成功");
        }else{
            ActionContext.getContext().put("msg", "請選擇上傳文件");
        }
        return "success";
    }
    
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public File getUpload() {
        return upload;
    }

    public void setUpload(File upload) {
        this.upload = upload;
    }

    public String getUploadFileName() {
        return uploadFileName;
    }

    public void setUploadFileName(String uploadFileName) {
        this.uploadFileName = uploadFileName;
    }

    public static long getSerialversionuid() {
        return serialVersionUID;
    }

    public String getUploadContentType() {
        return uploadContentType;
    }

    public void setUploadContentType(String uploadContentType) {
        this.uploadContentType = uploadContentType;
    }


}

3、struts.xml配置

如果不配置上傳的文件大小,當所選文件過大時,會報錯。

Struts2提供了一個文件上傳的攔截器,配置攔截器時,可以為其指定兩個參數:allowedTypes 和 maximumSize。

註意:其中常量裏配置的文件上傳大小是總的上傳文件大小,攔截器中是單個上傳文件大小。常量配置的允許大小,可視為總開關,不滿足條件的大小將不會觸發攔截且會報錯。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "struts-2.3.dtd" >
<struts>

    <!-- 熱部署 -->
    <constant name="struts.configuration.xml.reload" value="true"></constant>
    <!-- 修改struts2允許上傳的最大值 -->
    <constant name="struts.multipart.maxSize" value="7097152"/>
    <!-- 動態方法調用 -->
    <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>

    <package name="hello" namespace="/" extends="struts-default">

        <action name="fileupload_*" class="com.action.FileUploadAction" method="{1}">
            <!-- 引入文件上傳過濾器 -->
            <interceptor-ref name="fileUpload">
               <param name="maximumSize">7097152</param> <!-- 允許上傳的單個文件大小 -->
               <param name="allowedTypes">image/bmp</param> <!-- 允許上傳的文件類型,多個用,隔開 -->                
             </interceptor-ref>
             <!-- 配置系統默認攔截器 -->
             <interceptor-ref name="defaultStack"/>   
            <result name="input">/fileupload.jsp</result>  <!-- 文件過濾失敗後,轉入input視圖 -->
            
             <result name="success">/fileupload.jsp</result>

        </action>
        
    </package>
</struts>   

常見問題:

當我們上傳文件出錯時,會出現Struts2系統默認的提示信息,這些信息,可以根據<s:debug>標簽獲取,為了獲取更國際化的提示信息,例如,將提示信息改為中文。

操作步驟:

1、在struts.xml配置中加載全局國際化資源文件的常量

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

2、在src目錄下創建message.properties全國國際化文件,文件中添加如下內容

struts.messages.error.file.too.large=\u60A8\u8981\u4E0A\u4F20\u7684\u6587\u4EF6\u592A\u5927\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9

Struts2同時上傳多個文件

Action類:

public class ManyFileUploadAction extends  ActionSupport{
     private  List<File>  upload;  //多文件封裝為List
     private  List<String> uploadFileName;             
     public  String  manyFileUpload() throws Exception{
          for(int i=0;i<upload.size();i++){
              //處理每個文件上傳的業務操作
     }
}

Struts2之文件上傳下載