Struts2實現文件上傳

前臺form 表單:設置method=post,enctype=multipart/form-data。

struts2在原有的上傳解析器繼承上做了進一步封裝,更進一步簡化了文件上傳。

默認使用的是Jakarta和Common-FileUpload的文件上傳框架,因此,如果需要使用Struts2的文件上傳功能,則需要在web應用導入相關jar包。

Action需要使用3個屬性來封裝該文件域的信息:

(1)類型爲File的*屬性封裝了該文件域對應的文件內容;
(2)類型爲String的***FileName屬性封裝了該文件域對應的文件的文件類型;
(3)類型爲String的***ContentType屬性封裝了該文件域對應的文件的類型。

一、 搭建struts2環境

在myeclipse下,右擊項目->MyEclipse->Project Facets->install Apache Struts2。

如要自己搭建,需下載struts2包,寫struts.xml配置文件。
web.xml文件配置如下:

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>*.action</url-pattern>
  </filter-mapping>

二、 文件上傳

1.前臺頁面:

上傳頁面:

<body>
    <form action="upload.action" method="post" enctype="multipart/form-data">
        <input type="file" name="upload"/>
        <input type="submit" value="提交"/>
        <br>
        ${result}
    </form>
  </body>

input name屬性與後臺命名一致。

上傳失敗頁面:

<body>
    <h2>上傳失敗</h2>
    <s:fielderror></s:fielderror>
  </body>

需:

<%@ taglib uri="/struts-tags" prefix="s"%>

2.後臺Action

主要屬性upload,uploadContentType,uploadFileName。

package com.yf.action;

import java.io.File;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport{
    private File upload;
    private String uploadContentType;
    private String uploadFileName;
    private String result;
    public File getUoload() {
        return upload;
    }
    public void setUpload(File upload) {
        this.upload = upload;
    }
    public String getUploadContentType() {
        return uploadContentType;
    }
    public void setUploadContentType(String uploadContentType) {
        this.uploadContentType = uploadContentType;
    }
    public String getUploadFileName() {
        return uploadFileName;
    }
    public void setUploadFileName(String uploadFileName) {
        this.uploadFileName = uploadFileName;
    }
    public String getResult() {
        return result;
    }
    public void setResult(String result) {
        this.result = result;
    }
    @Override
    public String execute() throws Exception {
        String path = ServletActionContext.getServletContext().getRealPath("/images");
        File file = new File(path);
        if(!file.exists()){
            file.mkdir();
        }
        System.out.println(upload);
        FileUtils.copyFile(upload, new File(file,uploadFileName));
        result = "上傳成功";
        return SUCCESS;
    }

}

3.struts.xml文件配置

配置action及配置攔截器限制上傳文件的類型及大小。

<?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>
    <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
    <constant name="struts.devMode" value="true"/>
    <constant name="struts.multipart.saveDir" value="/tmp"/>
    <constant name="struts.custom.i18n.resources" value="app"></constant>

    <package name="default" namespace="/" extends="struts-default">
        <action name="upload" class="com.yf.action.UploadAction">
        <result>/index.jsp</result>
        <result name="input">/error.jsp</result>
        <!-- 配置攔截器限制上傳文件的類型及大小 -->
        <interceptor-ref name="fileUpload">
            <param name="allowedTypes">image/bmp,image/x-png,image/gif,image/jpeg</param>
            <param name="maximumSize">2M</param>
        </interceptor-ref>
        <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>
    </package>

</struts>    

4.新建properties文件

文件上傳失敗信息顯示到前臺,處理顯示出錯信息。

這裏寫圖片描述

文件內容如下:

struts.messages.error.file.too/large=\u4E0A\u4F20\u6587\u4EF6\u592A\u5927\u4E86\uFF01
struts.messages.error.content.type.not.allowed=\u4E0A\u4F20\u6587\u4EF6\u7C7B\u578B\u4E0D\u7B26\uFF01

即添加:
Name:struts.messages.error.file.too/large
value : 上傳文件太大了!
Name : struts.messages.error.content.type.not.allowed
value: 上傳文件類型不符!

運行結果如下:
選擇jpg圖片,大小不超過2M,運行後

這裏寫圖片描述

選擇非圖片文件:

這裏寫圖片描述

如需批量上傳文件,將後臺upload,uploadContentType,uploadFileName均改爲List,循環讀取上傳文件保存到硬盤,前臺加入input ,name屬性一致。

發佈了45 篇原創文章 · 獲贊 13 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章