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属性一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值