• SpringMVC实现表单文件的上传


    文件上传

    储备知识

    Content-Type

    类型

    HTTP的Content-Type是一种标识HTTP请求或响应中包含的实体的媒体类型的头部字段。它指示了数据的类型,使接收方能够正确处理数据。以下是一些常见的Content-Type类型:text/plain:纯文本,没有特定格式。
    text/html:HTML文档
    text/css:Cascading Style Sheets (CSS)。
    text/javascript:JavaScript代码。
    application/json:JSON数据。
    application/xml:XML数据。
    application/pdf:Adobe PDF文档。
    application/msword:Microsoft Word文档。
    application/vnd.ms-excel:Microsoft Excel文档。
    image/jpeg:JPEG图像。
    image/png:PNG图像。
    image/gif:GIF图像。
    audio/mpeg:MPEG音频文件。
    video/mp4:MP4视频文件。
    multipart/form-data:通常用于文件上传,如表单数据,它可以包含文本字段和二进制文件。
    application/x-www-form-urlencoded:通常用于HTML表单提交的默认编码,将表单数据编码为键值对。
    application/octet-stream:未指定的二进制数据,通常是未知媒体类型。
    application/zip:ZIP归档文件。
    application/x-gzip:GZIP压缩文件。
    application/octet-stream:通用的二进制流,通常用于未知或自定义数据格式。

    Content-Type在表单提交的时候怎么设置

    在表单提交时,您可以使用HTML的元素来设置Content-Type,通常是通过指定enctype属性。enctype属性用于指定在提交表单数据时使用的编码类型,以确保服务器能够正确处理数据。以下是两种常见的enctype属性设置:
    ·1、application/x-www-form-urlencoded(默认):
    这是HTML表单提交的默认编码类型,会将表单字段编码为键值对,并以application/x-www-form-urlencoded的Content-Type提交。在HTML中,您无需显式指定它,因为它是默认值。

    • 1
    • 2
    • 3
    • 4
    • 5

    2、multipart/form-data:
    这是用于文件上传的编码类型,它允许表单包含二进制数据,例如文件。当您想要上传文件时,通常需要使用这个enctype属性。

    • 1
    • 2
    • 3
    • 4
    • 5

    enctype属性只适用于POST方法,因为GET方法不支持将数据请求体与表单一起发送。在处理接收到的表单数据时,服务器应该根据Content-Type来适当解析数据。如果您使用Java Servlet来处理表单提交,可以使用Commons FileUpload或Servlet 3.0+的request.getPart()方法来处理multipart/form-data编码类型的表单数据。
    3、application/json
    您需要在表单的enctype属性中指定application/json,这告诉浏览器提交的数据是JSON格式。

    注意,enctype属性的值"application/json"不是HTML表单的标准内容类型,而是自定义的,因此,浏览器不会自动将表单字段编码为JSON数据。您需要使用JavaScript或其他手段将表单字段的值转换为JSON格式 使用JavaScript将表单数据转换为JSON: 使用JavaScript来监听表单的提交事件,并将表单字段的值转换为JSON格式。您可以使用JSON.stringify()函数来实现这一点。 ``` ```

    上传文件的表单需要设置enctype=“multipart/form-data”

    HTML表单需要设置enctype="multipart/form-data"这个属性,虽然不这么设置的确无法上传,但这是为什么呢?

    HTML表单如何打包数据文件是由enctype这个属性决定的。enctype有以下几种取值:

    application/x-www-form-urlencoded在发送前编码所有字符(默认)(空格被编码为’+’,特殊字符被编码为ASCII十六进制字符)
    multipart/form-data 不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。
    text/plain 空格转换为 “+” 加号,但不对特殊字符编码。
    默认enctype=application/x-www-form-urlencoded,所以表单的内容会按URL规则编码,然后根据表单的提交方法:

    method=’get’ 编码后的表单内容附加在请求连接后
    method=’post’ 编码后的表单内容作为post请求的正文内容

    springMVC进行文件上传

    原文链接:https://blog.csdn.net/suifeng3051/article/details/51659731

    配置mutipart resolver

    实现文件上传,其实就是解析一个Mutipart请求。DispatchServlet自己并不负责去解析mutipart 请求,而是委托一个实现了MultipartResolver接口的类来解析mutipart请求。在Spring3.1之后Spring提供了两个现成的MultipartResolver接口的实现类:

    CommonMutipartResolver:通过利用Jakarta Commons FileUpload来解析mutipart 请求
    StandardServletMutipartResolver:依赖Servlet3.0来解析mutipart请求
    
    • 1
    • 2

    所以要实现文件上传功能,只需在我们的项目中配置好这两个bean中的任何一个即可。其实这两个都很好用,如果我们部署的容器支持Servlet3.0,我们完全可以使用StandardServletMutipartResolver。但是如果我们的应用部署的容器不支持Servlet3.0或者用到的Spring版本是3.1以前的,那么我们就需要用到CommonMutipartResolver了。下面就具体介绍一下两种bean的配置,当然也是实现文件上传的两种配置。
    方式一: 通过StandardServletMutipartResolver解析mutipart 请求
    1)、配置multipartResolver的bean

    
    
    • 1

    2)、配置MutipartResolver相关属性
    StandardServletMutipartResolver依赖于Servlet3.0,所以要想使用StandardServletMutipartResolver,我们还必须在DispatchServlet配置里面 注册一个 MultipartConfigElement元素,具体配置方式如下:

    
        appServlet
         org.springframework.web.servlet.DispatcherServlet 
        1
        
            /tmp/spittr/uploads
            2097152
            4194304
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    mutipart-config里面有三个配置项:

    location:上传文件用到的临时文件夹,是一个绝对路径,需要注意,这个属性是必填的
    max-file-size:上传文件的最大值,单位是byte,默认没有限制
    max-request-size:整个mutipart请求的最大值,单位是byte,默认没有限制
    方式二:通过CommonMutipartResolver 解析mutipart 请求
    当然,如果我们部署的容器不是Servlet3.0,我们还可以使用CommonMutipartResolver,不过这个需要依赖Apache的commons-fileupload第三方类库。

    
            commons-fileupload
            commons-fileupload
            1.3.1
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    配置multipartResolver的bean

    
           
           
    
    
    • 1
    • 2
    • 3
    • 4

    写个前端和Crontroller测试一下
    upload.jsp

    
    
    
      
      
      
      
      
      
      
    
    
    

    upload

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    FileUploadController.java

    package com.wpp.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.*;
    import org.springframework.web.multipart.MultipartFile;
    import org.springframework.ui.Model;
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    @Controller
    @RequestMapping(value = "/")
    public class FileUploadController {
        private static String UPLOADED_FOLDER = "/home/10307006@zte.intra/驱动/"; // 设置上传文件保存路径
    
        @GetMapping("/file")
        public String index() {
            return "upload";
        }
        @PostMapping("/upload")
        public String singleFileUpload(@RequestParam("file") MultipartFile file, Model model) {
            if (file.isEmpty()) {
                model.addAttribute("message", "请选择一个文件上传");
                return "upload";
            }
    
            try {
                byte[] bytes = file.getBytes();
                Path path = Paths.get(UPLOADED_FOLDER + file.getOriginalFilename());
                Files.write(path, bytes);
    
                model.addAttribute("message", "文件上传成功: " + file.getOriginalFilename());
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            return "upload";
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
  • 相关阅读:
    分布式锁&kafka事务提交等编码技巧
    Shopee虾皮API:获取商家店铺商品列表
    八.调试的技巧
    leetcode-每日一题-813-最大平均值和的分组(中等,dp)
    【校招VIP】前端算法考点之大数据相关
    (生物信息学)R语言绘图初级——3-5分文章必备——散点图
    web前端 基于html实现花店购物网站源码(HTML+CSS+JavaScript) 企业网站制作
    cefshar117.2.40(cef117.2.4)Chromium 117.0.5938.150小更新
    Spring Boot 程序启动原理:
    一个注解搞定责任链,学还是不学?
  • 原文地址:https://blog.csdn.net/Artisan_w/article/details/133806957