IT虾米网

Struts2笔记--文件上传详解

sanshao 2019年08月20日 编程语言 154 0

  

  Servlet 3.0规范的HttpServletRequest已经提供了方法来处理文件上传但这种上传需要在Servlet中完成。而Struts2则提供了更简单的封装。

  Struts2默认使用的是Jakarta的Common-FileUpload的文件上传框架,因此使用Struts2的文件上传功能,则需要添加两个jar包,即commons-io-2.2.jar和commons-fileupload-1.3.1.jar。

 

Struts2简单文件上传示例:

1.文件上传页面

  为了能上传文件,表单的method必须设置为POST,并且enctype设置为multipart/form-data。一旦设置了enctype为multipart/form-data,此时浏览器将会采用二进制流的方式来处理表单数据。

<%@ taglib prefix="s" uri="/struts-tags" %> 
<%-- 
  Created by IntelliJ IDEA. 
  User: Administrator 
  Date: 2018/1/16 
  Time: 14:06 
  To change this template use File | Settings | File Templates. 
--%> 
<%@ page contentType="text/html;charset=UTF-8" language="java" %> 
<html> 
<head> 
    <title>Struts2 简单文件上传</title> 
</head> 
<body> 
    <s:form action="file_upload" method="POST" enctype="multipart/form-data"> 
        <s:file name="upload" label="选择文件"/> 
        <s:submit value="上传"/> 
    </s:form> 
</body> 
</html>

2.处理上传请求的Action

/** 
 * Description:Struts2简单文件上传 
 * Author: Eleven 
 * Date: 2018/1/24 10:39 
 */ 
public class FileAction extends ActionSupport{ 
 
    //上传文件 
    private File upload; 
    //上传文件类型 
    private String uploadContentType; 
    //上传文件名 
    private String uploadFileName; 
 
    //文件上传允许的类型在struts.xml中使用param标签动态设置了 
    private String allowTypes; 
 
    public String page(){ 
        return "page"; 
    } 
 
    public void upload() { 
 
        //文件上传: 
        //1.读取文件内容 
        //2.将文件内容写到指定文件 
        try{ 
            System.out.println("文件上传允许的类型="+allowTypes); 
            String realPath = ServletActionContext.getServletContext().getRealPath("/upload"); 
            System.out.println("项目的绝对路径="+realPath); 
            //创建文件保存目录 
            new File(realPath).mkdir(); 
            File file = new File(realPath+"/"+uploadFileName); 
            //文件不存在则创建 
            if(!file.exists()){ 
                file.createNewFile(); 
            } 
            FileOutputStream out = new FileOutputStream(file); 
            FileInputStream in = new FileInputStream(upload); 
            byte[] buffer = new byte[1024]; 
            int len = 0; 
            //边读边写 每次读取1kb 写1kb 
            while((len = in.read(buffer))>0){ 
                out.write(buffer,0,len); 
            } 
            System.out.println("文件上传成功..."); 
        }catch(Exception e){ 
            e.printStackTrace(); 
        } 
 
    } 
 
    public File getUpload() { 
        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 getAllowTypes() { 
        return allowTypes; 
    } 
 
    public void setAllowTypes(String allowTypes) { 
        this.allowTypes = allowTypes; 
    } 
}

  如果表单中包含一个name属性为xxx的文件域,则对应的Action中需要使用三个成员变量来封装该文件域的信息。

    类型为File的xxx成员变量封装了该文件域对应的文件内容。

    类型为String的xxxFileName成员变量封装了该文件域对应的文件的文件名。

    类型为String的xxxContentType成员变量封装了该文件域对应的文件的文件类型。

 

3.配置struts.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 
    "http://struts.apache.org/dtds/struts-2.3.dtd"> 
 
<struts> 
    <constant name="struts.enable.DynamicMethodInvocation" value="false" /> 
    <constant name="struts.devMode" value="true" /> 
 
    <package name="default" namespace="/" extends="struts-default"> 
 
        <!--文件上传--> 
        <action name="file_*" class="eleven.action.FileAction" method="{1}"> 
            <result name="page">/WEB-INF/jsp/fileUpload.jsp</result> 
            <!--动态设置action的属性,这里举例设置了允许文件上传的类型,但是action程序中并未做过多的处理--> 
            <param name="allowTypes">image/png,image/gif,image/jpeg</param> 
        </action> 
 
    </package> 
 
</struts>

  

拦截器实现文件过滤  

  Struts2提供了一个文件上传的拦截器,fileUpload,为了让该拦截器起作用,要在action中配置拦截器引用。

  配置fileUpload拦截器时,可以为其指定两个参数:

    allowTypes:允许上传的文件类型,多个文件类型之间用英文逗号,隔开

    maximumSize:允许上传的文件大小,单位是字节。

  当文件过滤失败后,系统自动转入input逻辑视图,因此必须为该Action配置名为input的逻辑视图。除此之外,还必须显示地为该Action配置defaultStack的拦截器引用。

 

struts.xml配置文件如下:

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 
    "http://struts.apache.org/dtds/struts-2.3.dtd"> 
 
<struts> 
    <constant name="struts.enable.DynamicMethodInvocation" value="false" /> 
    <constant name="struts.devMode" value="true" /> 
 
    <package name="default" namespace="/" extends="struts-default"> 
 
        <!--文件上传--> 
        <action name="file_*" class="eleven.action.FileAction" method="{1}"> 
            <!--配置fileUpload拦截器 且配置在defaultStack拦截器栈之前--> 
            <interceptor-ref name="fileUpload"> 
                <!--允许上传的文件类型--> 
                <param name="allowedTypes">image/png,image/gif,image/jpeg</param> 
                <!--允许上传文件大小--> 
                <param name="maximumSize">2000</param> 
            </interceptor-ref> 
            <!--配置系统默认拦截器--> 
            <interceptor-ref name="defaultStack"/> 
            <!--配置input视图页面--> 
            <result name="input">/WEB-INF/jsp/input.jsp</result> 
 
            <result name="page">/WEB-INF/jsp/fileUpload.jsp</result> 
        </action> 
 
    </package> 
 
</struts>

  上面配置的文件上传的拦截器,要求文件上传的类型只能是图片文件,并且文件大小不能大于2000字节,如果上传文件太大,或者类型不符合,则将跳转到input逻辑视图。

 

发布评论

分享到:

IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

Struts2笔记--Action访问Servlet API详解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。