zoukankan      html  css  js  c++  java
  • Struts2笔记--文件上传

      

      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逻辑视图。

  • 相关阅读:
    .NET Cache缓存
    异步
    es6常用功能
    vue-router路由懒加载
    vue中nextTick和$nextTick
    动态模板中 swiper 划不动问题
    javaScript正则判断手机号
    Mac终端使用技巧
    alert IOS自带域名
    vue css background路径不对
  • 原文地址:https://www.cnblogs.com/eleven258/p/8358159.html
Copyright © 2011-2022 走看看