Spring Boot REST API 文件上传/保存示例

本指南向您展示如何使用 Spring Boot REST API 上传/保存文件。通过HTTP 多部分请求上传文件将由MultipartFile. 它是在多部分请求中接收到的上传文件的表示,通过它我们可以获取文件内容并存储在数据库或文件系统中。

PS 在 Windows 环境下测试。

我们将建造什么

我们将创建一个 Spring Boot Web 应用程序,它接受文件上传并将文件保存到数据库或文件系统位置。

类似的帖子:

  1. Spring Boot - 显示来自数据库和类路径的图像
  2. 如何使用 Spring MVC 在数据库中插入图像
  3. Spring MVC如何从数据库中获取数据

使用的技术

查找此应用程序中使用的所有技术的列表。

  1. 弹簧工具套件 4
  2. JDK 8
  3. Spring Boot 2.2.4.RELEASE
  4. Spring Data JPA 2.2.4.RELEASE
  5. MySQL 数据库
  6. 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.保存在文件系统中

要在系统目录中保存/复制/上传文件,请按照以下步骤操作;

  1. getBytes()通过调用接口的方法获取HTTP多部分请求进来的文件的字节数MultipartFile。它返回文件的字节数组。
  2. 准备好要保存/复制/上传文件的路径(目录位置)。getOriginalFilename()方法返回文件的原始名称。
  3. 通过将字节数组写入所需位置Files.write(pathbytes);
@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 控制器

第一步与我们上面讨论的相同:

  1. 获取bytes文件的。
  2. 将 HTTP 多部分表单数据设置为实体。
  3. 调用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);
	}
}
复制

测试应用程序

让我们测试应用程序,执行上面的类,它将启动应用程序,然后按照以下步骤操作:

  1. 打开 Postman 客户端,选择 HTTP POST 方法,在地址栏中输入您的端点。
  2. 单击“正文”选项卡并检查表单数据。将数据填充到键值对中。对于文件,从下拉列表中选择文件类型。
  3. 点击发送按钮。

参考

  1. Spring Boot-上传文件
  2. 如何使用 Spring MVC 在数据库中插入图像
  3. 如何使用 Spring MVC 从数据库中获取图像
  4. 二进制大对象 - 维基百科
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值