本指南向您展示如何使用 Spring Boot REST API 上传/保存文件。通过HTTP 多部分请求上传文件将由MultipartFile
. 它是在多部分请求中接收到的上传文件的表示,通过它我们可以获取文件内容并存储在数据库或文件系统中。
PS 在 Windows 环境下测试。
我们将建造什么
我们将创建一个 Spring Boot Web 应用程序,它接受文件上传并将文件保存到数据库或文件系统位置。
类似的帖子:
使用的技术
查找此应用程序中使用的所有技术的列表。
- 弹簧工具套件 4
- JDK 8
- Spring Boot 2.2.4.RELEASE
- Spring Data JPA 2.2.4.RELEASE
- MySQL 数据库
- Maven 3
所需的依赖项
这些在此应用程序中所需的基本依赖项,将它们添加到您的pom.xml中。
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 https://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.2.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>org.websparrow</groupId>
<artifactId>spring-boot-upload-file</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
复制
1.保存在文件系统中
要在系统目录中保存/复制/上传文件,请按照以下步骤操作;
getBytes()
通过调用接口的方法获取HTTP多部分请求进来的文件的字节数MultipartFile
。它返回文件的字节数组。- 准备好要保存/复制/上传文件的路径(目录位置)。
getOriginalFilename()
方法返回文件的原始名称。 - 通过将字节数组写入所需位置
Files.write(path, bytes);
@PostMapping("/directory")
public String uploadToDirectory(@RequestParam MultipartFile file) throws IOException {
byte[] bytes = file.getBytes();
Path path = Paths.get(DIR_TO_UPLOAD + file.getOriginalFilename());
Files.write(path, bytes);
return "File uploaded";
}
复制
2. 保存在数据库中
同样,我们可以将多部分表单数据保存到数据库表中。我们只需要处理插入文件的列定义。
2.1 实体
假设,我们要保存印度总理的 id、姓名和头像,那么实体类将如下所示:
印度总理.java
package org.websparrow.entity;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Table;
@Entity
@Table
public class PrimeMinisterOfIndia implements Serializable {
private static final long serialVersionUID = 2842598520185366295L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
@Lob
private byte[] photo;
// Generate Getters and Setters...
}
复制
为什么
@Lob
在这里使用注释?因为当想要将大型数据集/文件对象存储到数据库表中时,我们需要巨大的空间。LOB 代表 Large OBject,一个 LOB 的最大容量是 (4 gigabytes-1) 字节。它将产生以下 SQL 定义。
CREATE TABLE `prime_minister_of_india` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `photo` longblob, PRIMARY KEY (`id`) );
复制
2.2 存储库
FileUploadRepository.java
package org.websparrow.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import org.websparrow.entity.PrimeMinisterOfIndia;
@Repository
public interface FileUploadRepository extends
JpaRepository<PrimeMinisterOfIndia, Integer> {
}
复制
2.3 控制器
第一步与我们上面讨论的相同:
- 获取
bytes
文件的。 - 将 HTTP 多部分表单数据设置为实体。
- 调用
save(Entity e)
Spring DataJpaRepository
接口的方法。
@PostMapping(value = "/database")
public String uploadToDatabase(@RequestParam String name, @RequestParam MultipartFile file)
throws IOException {
// Set the form data into entity
PrimeMinisterOfIndia pmOfIndia = new PrimeMinisterOfIndia();
pmOfIndia.setName(name);
pmOfIndia.setPhoto(file.getBytes());
// Save the records into the database
fileUploadRepository.save(pmOfIndia);
return "Records saved into database.";
}
复制
这是满足以下两个方面的完整控制器类: 1. 将文件上传到类路径/系统目录和 2. 将表单数据和文件传递到数据库表中。
文件上传控制器.java
package org.websparrow.controller;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.websparrow.entity.PrimeMinisterOfIndia;
import org.websparrow.repository.FileUploadRepository;
@RestController
@RequestMapping("/upload/file")
public class FileUploadController {
@Autowired
private FileUploadRepository fileUploadRepository;
private static final String DIR_TO_UPLOAD = "C:\\Users\\Atul\\Desktop\\sparrow\\";
@PostMapping(value = "/database")
public String uploadToDatabase(@RequestParam String name, @RequestParam MultipartFile file)
throws IOException {
// Set the form data into entity
PrimeMinisterOfIndia pmOfIndia = new PrimeMinisterOfIndia();
pmOfIndia.setName(name);
pmOfIndia.setPhoto(file.getBytes());
// Save the records into the database
fileUploadRepository.save(pmOfIndia);
return "Records saved into database.";
}
@PostMapping("/directory")
public String uploadToDirectory(@RequestParam MultipartFile file) throws IOException {
byte[] bytes = file.getBytes();
Path path = Paths.get(DIR_TO_UPLOAD + file.getOriginalFilename());
Files.write(path, bytes);
return "File uploaded";
}
}
复制
运行应用程序
该类 SpringBootUploadFileAppication
包含主要方法并负责启动应用程序。
SpringBootUploadFileApplication.java
package org.websparrow;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootUploadFileApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootUploadFileApplication.class, args);
}
}
复制
测试应用程序
让我们测试应用程序,执行上面的类,它将启动应用程序,然后按照以下步骤操作:
- 打开 Postman 客户端,选择 HTTP POST 方法,在地址栏中输入您的端点。
- 单击“正文”选项卡并检查表单数据。将数据填充到键值对中。对于文件,从下拉列表中选择文件类型。
- 点击发送按钮。