【Springboot】批量图片上传 从HttpServletRequest到List<MultipartFile>

在这里插入图片描述

前言

本文实现批量图片上传,环境为:

JDK11

Maven 3.5

springboot 2.3.7

IntelliJ IDEA 2021.2.3 (Community Edition)

Postman-win64-8.12.4

实现

涉及API

HttpServletRequest 是 Java Servlet API 中的一个接口,它是处理 HTTP 请求的核心组件。当客户端(如 Web 浏览器)向服务器发送一个 HTTP 请求时,Servlet 容器(如 Apache Tomcat)会创建一个 HttpServletRequest 对象,并将其作为参数传递给相应的 Servlet 或 Filter 的服务方法。

HttpServletRequest 接口包含方法:

  1. 请求信息获取:
    getRequestURL():获取请求的完整 URL。
    getRequestURI():获取请求的 URI(不包括查询字符串)。
    getQueryString():获取查询字符串部分。
    getMethod():获取请求的方法类型,如 GET、POST、PUT、DELETE 等。
    getHeader(String name):获取指定的请求头值。
    getParameter(String name):获取指定的请求参数值。
  2. 请求属性和参数:
    setAttribute(String name, Object value):设置请求范围的属性。
    getAttribute(String name):获取请求范围的属性。
    getParameterMap():获取所有请求参数的映射。
  3. 请求体访问:
    getInputStream():获取请求体的输入流,用于读取 POST 或 PUT 请求中的数据。
  4. 请求转发和重定向:
    getRequestDispatcher(String path):获取请求调度器,用于进行请求转发或包含。
  5. 会话管理:
    getSession():获取或创建与该请求相关的 HTTP 会话。
  6. 用户认证和安全:
    getUserPrincipal():获取当前已认证用户的主体信息。
    isUserInRole(String role):检查用户是否属于指定的角色。

通过 HttpServletRequest,开发者可以访问和操作 HTTP 请求的所有相关信息,包括请求 URL、参数、头信息、请求方法、请求体内容等。这些信息对于处理客户端请求、执行业务逻辑、生成响应内容等都是非常重要的,在实际的 Web 开发中HttpServletRequest 是非常常用的一个接口。

MultipartFile 是 Spring Framework 中的一个接口,主要用于处理文件上传的场景。在构建 Web 应用程序时,当用户通过表单或 API 上传文件时,这些文件会被封装成 MultipartFile 对象,以便在服务器端进行进一步的处理。

MultipartFile 包含:

  1. 文件信息获取:
    getOriginalFilename():获取上传文件的原始文件名。
    getSize():获取上传文件的大小(以字节为单位)。
    getContentType():获取上传文件的 MIME 类型。
  2. 文件内容访问:
    getBytes():将整个文件内容转换为字节数组。
    getInputStream():获取文件内容的输入流,用于逐行读取或按需读取数据。
  3. 文件保存:
    transferTo(File dest):将文件内容转移到指定的本地文件。这个方法会移动文件,并可能覆盖目标位置已存在的文件。

依赖配置

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>org.example</groupId>
    <artifactId>springboot-upload-image</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web-services</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

application.properties

spring.servlet.multipart.max-request-size=10MB
spring.servlet.multipart.max-file-size=10MB

功能编写

主程序类 MainApplication.java

package org.sample;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class, args);
    }
}

控制类编写 FileController.java

package org.sample.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import javax.servlet.http.HttpServletRequest;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Iterator;
import java.util.List;

@RestController
@Slf4j
public class FileController {

    private static String UPLOAD_PATH = "File/image";

    // 上传图片
    @RequestMapping(value = "/uploadImage", method = RequestMethod.POST)
    @ResponseBody
    public String uploadImage(HttpServletRequest httpServletRequest) {
        MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) httpServletRequest;
        Iterator<String> fileNames = multiRequest.getFileNames();
        List<MultipartFile> multipartFiles = multiRequest.getFiles(fileNames.next());

        for (MultipartFile image : multipartFiles) {
            try {
                String name = image.getOriginalFilename();
                System.out.println(name);

                InputStream inputStream = image.getInputStream();
                Path directory = Paths.get(UPLOAD_PATH);
                if (!Files.exists(directory)) {
                    Files.createDirectories(directory);
                }
                long copy = Files.copy(inputStream, directory.resolve(name));
            } catch (Exception e) {
                log.error(e.getMessage(), e);
                return "上传失败";
            }
        }

        return "上传成功,大小:" + " ; url访问路径为:" + UPLOAD_PATH;
    }
}

文件结构

在这里插入图片描述

运行

运行 MainApplication.java

在这里插入图片描述

打开postman,编写post请求如下:

在这里插入图片描述
请求体选择form-data,数据选择file类型,点击select files:

在这里插入图片描述
我们选择几个图片,然后send

在这里插入图片描述
上传成功,可以看到图片名字已经打印出来了

在这里插入图片描述
我们查看图片保存目录:

在这里插入图片描述
可以看到刚刚的图片,成功

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锥栗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值