前言
本文实现批量图片上传,环境为:
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 接口包含方法:
- 请求信息获取:
getRequestURL()
:获取请求的完整 URL。
getRequestURI()
:获取请求的 URI(不包括查询字符串)。
getQueryString()
:获取查询字符串部分。
getMethod()
:获取请求的方法类型,如 GET、POST、PUT、DELETE 等。
getHeader(String name)
:获取指定的请求头值。
getParameter(String name)
:获取指定的请求参数值。 - 请求属性和参数:
setAttribute(String name, Object value)
:设置请求范围的属性。
getAttribute(String name)
:获取请求范围的属性。
getParameterMap()
:获取所有请求参数的映射。 - 请求体访问:
getInputStream()
:获取请求体的输入流,用于读取 POST 或 PUT 请求中的数据。 - 请求转发和重定向:
getRequestDispatcher(String path)
:获取请求调度器,用于进行请求转发或包含。 - 会话管理:
getSession()
:获取或创建与该请求相关的 HTTP 会话。 - 用户认证和安全:
getUserPrincipal()
:获取当前已认证用户的主体信息。
isUserInRole(String role)
:检查用户是否属于指定的角色。
通过 HttpServletRequest,开发者可以访问和操作 HTTP 请求的所有相关信息,包括请求 URL、参数、头信息、请求方法、请求体内容等。这些信息对于处理客户端请求、执行业务逻辑、生成响应内容等都是非常重要的,在实际的 Web 开发中HttpServletRequest 是非常常用的一个接口。
MultipartFile 是 Spring Framework 中的一个接口,主要用于处理文件上传的场景。在构建 Web 应用程序时,当用户通过表单或 API 上传文件时,这些文件会被封装成 MultipartFile 对象,以便在服务器端进行进一步的处理。
MultipartFile
包含:
- 文件信息获取:
getOriginalFilename()
:获取上传文件的原始文件名。
getSize()
:获取上传文件的大小(以字节为单位)。
getContentType()
:获取上传文件的 MIME 类型。 - 文件内容访问:
getBytes()
:将整个文件内容转换为字节数组。
getInputStream()
:获取文件内容的输入流,用于逐行读取或按需读取数据。 - 文件保存:
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
上传成功,可以看到图片名字已经打印出来了
我们查看图片保存目录:
可以看到刚刚的图片,成功