• SSM框架之SpringMVC(5)文件上传


    SpringMVC(5)文件上传

    1、实现文件上传的前期准备

    1.1、文件上传的必要前提

    A form 表单的 enctype 取值必须是: multipart/form-data(默认值是:application/x-www-form-urlencoded)
    enctype:是表单请求正文的类型

    B method 属性取值必须是 Post

    C 提供一个文件选择域

    <form action="user/fileupload1" method="post" enctype="multipart/form-data">
        选择文件<input type="file" name="upload"><br>
        <input type="submit" value="上传">
    </form>
    

    1.2、文件上传的原理分析

    当 form 表单的 enctype 取值不是默认值后, request.getParameter()将失效。
    enctype=”application/x-www-form-urlencoded”时, form 表单的正文内容是:
    key=value&key=value&key=value
    当 form 表单的 enctype 取值为 Mutilpart/form-data 时,请求正文内容就变成:

    每一部分都是 MIME 类型描述的正文
    -----------------------------7de1a433602ac               分界符
    Content-Disposition: form-data; name="userName"          协议头 
    aaa														 协议的正文
    -----------------------------7de1a433602ac
    Content-Disposition: form-data; name="file";
    filename="C:UserszhyDesktopfileupload_demofile.txt"
    Content-Type: text/plain                                 协议的类型(MIME 类型)
    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
    -----------------------------7de1a433602ac--
    

    1.3、借助第三方组件实现文件上传

    使用 Commons-fileupload 组件实现文件上传,需要导入该组件相应的支撑 jar 包: Commons-fileupload 和
    commons-io。 commons-io 不属于文件上传组件的开发 jar 文件,但 Commons-fileupload 组件从 1.1 版本开始,它工作时需要 commons-io 包的支持。

    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.1</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
    </dependency>
    

    2、SpringMVC实现文件上传

    2.1、不使用springMVC的文件上传方式

    1.导入文件的jar

    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.1</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
    </dependency>
    

    2.编写文件上传的jsp页面

    <h3>文件上传</h3>
    
        <form action="user/fileupload1" method="post" enctype="multipart/form-data">
            选择文件<input type="file" name="upload"><br>
            <input type="submit" value="上传">
        </form><br><br>
    

    3.编写controller控制器

    /**
     * 使用原始方法解析
     * @param request
     * @return
     * @throws Exception
     */
    @RequestMapping("/fileupload1")
    public String fileupload(HttpServletRequest request) throws Exception {
        System.out.println("开始上传...");
    
        //使用fileupload组件完成文件上传
        //上传位置
        String path = request.getSession().getServletContext().getRealPath("/uploads/");
        File file =new File(path);
        if (!file.exists()){
            file.mkdirs();
        }
    
        //解析request对象,获取上传文件项
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        //解析request
        List<FileItem> items = upload.parseRequest(request);
        //遍历
        for (FileItem item:items){
            //判断,当前item对象是否为上传文件项
            if (item.isFormField()){
                //true表示普通表单项
            }else {
                //false上传文件项
                //获取上传文件项名称
                String filename = item.getName();
                String uuid = UUID.randomUUID().toString().replace("-", "");
                filename = uuid+"-"+filename;
                //完成文件上传
                item.write(new File(path,filename));
                //删除临时文件
                item.delete();
            }
        }
        System.out.println("文件上传成功....");
    
        return "success";
    }
    

    2.2、springMVC传统方式实现文件上传

    1. SpringMVC框架提供了MultipartFile对象,该对象表示上传的文件,要求变量名称必须和表单file标签的
      name属性名称相同。
    2. 代码如下

    jsp页面

    <h3>springMVC方式文件上传</h3>
    
    <form action="user/fileupload2" method="post" enctype="multipart/form-data">
        选择文件<input type="file" name="upload"><br>
        <input type="submit" value="上传">
    </form>
    

    控制器代码:

    @RequestMapping("/fileupload2")
    public String fileupload2(HttpServletRequest request, MultipartFile upload) throws Exception {
        System.out.println("springmvc开始上传...");
    
        //使用fileupload组件完成文件上传
        //上传位置
        String path = request.getSession().getServletContext().getRealPath("/uploads/");
        File file =new File(path);
        if (!file.exists()){
            file.mkdirs();
        }
    
        String filename = upload.getOriginalFilename();
    
        //false上传文件项
        //获取上传文件项名称
    
        String uuid = UUID.randomUUID().toString().replace("-", "");
        filename = uuid+"-"+filename;
        //完成文件上传
        upload.transferTo(new File(path,filename));
    
        System.out.println("文件上传成功....");
    
        return "success";
    }
    

    3、配置文件解析器对象

    <!--文件解析器对象-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxInMemorySize" value="10485760"></property>
    </bean>
    

    2.3、SpringMVC跨服务器方式文件上传

    1。 分服务器的目的

    在实际开发中,我们会有很多处理不同功能的服务器。例如:
    应用服务器:负责部署我们的应用
    数据库服务器:运行我们的数据库
    缓存和消息服务器:负责处理大并发访问的缓存和消息
    文件服务器:负责存储用户上传文件的服务器。
    (注意:此处说的不是服务器集群)

    2 准备两个 tomcat 服务器,并创建一个用于存放图片的 web 工程

    ​ 注意:在开启第二个tomcat时要修改tomcat服务器所占用的端口如把8080改为9090,否则第二个tomcat服务器不能打开。

    在文件服务器的 tomcat 配置中加入,允许读写操作。

    文件位置: E:javaapache-tomcat-9.0.17confweb.xml

    跨服务器上传文件时要修改的webxml的配置、

    3.jsp

    <h3>跨服务器springMVC方式文件上传</h3>
    
    <form action="user/fileupload3" method="post" enctype="multipart/form-data">
        选择文件<input type="file" name="upload"><br>
        <input type="submit" value="上传">
    </form>
    

    4.实现文件上传控制器

    @RequestMapping("/fileupload3")
    public String fileupload3(MultipartFile upload) throws Exception {
        System.out.println("跨服务器springmvc开始上传...");
    
       //定义上传服务器路径
        String path = "http://localhost:9090/fileserver_war/uploads/";
    
        //false上传文件项
        //获取上传文件项名称
        String filename = upload.getOriginalFilename();
        String uuid = UUID.randomUUID().toString().replace("-", "");
        filename = uuid+"-"+filename;
        //完成文件上传,跨服务器
        Client client = Client.create();
    
        //连接图片服务器
        WebResource webResource = client.resource(path + filename);
    
        //上传文件
    
        webResource.put(upload.getBytes());
    
        System.out.println("文件上传成功....");
    
        return "success";
    }
    
  • 相关阅读:
    CSS媒体查询
    重新认识caniuse
    范仁义css3课程---40、box-sizing属性实例
    前端超级实用技巧---2、css、js兼容性查询网站can i use
    日常英语---200221(shrink)
    心得体悟帖---200221(方针:进可攻退可守的方式:先把不熟悉的知识点录)
    心得体悟帖---200221(本来二月份就到了三月之期的)
    心得体悟帖---200220(对不同的人,用不同的处理方式(这个你远远没有理解))
    java中的String.format使用
    android中的ellipsize设置(省略号的问题)
  • 原文地址:https://www.cnblogs.com/wf614/p/11673816.html
Copyright © 2020-2023  润新知