思维导图
🌟前言
在开发系统过程中,往往离不开系统文件上传于下载的功能,本篇文章就对SpringBoot实现文件上传与下载功能作出演示。
🌟要点准备
MultipartFile是Spring框架提供的一个接口,用于处理文件上传的请求
。它封装了上传的文件内容、文件名、大小等信息,并提供了一些常用的方法来操作文件。下表是常用的API
方法 | 描述 |
String getOriginalFilename() |
获取上传文件的原始文件名 |
String getName() |
获取文件域的名称 |
String getContentType() |
获取上传文件的内容类型 |
boolean isEmpty() |
判断上传的文件是否为空 |
long getSize() |
获取上传文件的大小,单位为字节 |
byte[] getBytes() |
将上传文件的内容以字节数组形式返回 |
InputStream getInputStream() |
获取上传文件的输入流,可以用于读取文件内容 |
void transferTo(File dest) |
将上传文件保存到指定的目标文件 |
🌟实现步骤
功能概述:实现文件上传功能并保存到数据库表file中,以及文件下载功能。
实现思路:
- 客户端通过发送上传请求到 Spring Boot 服务器,服务器返回一个上传页面供用户选择文件。
- 用户选择并上传文件,服务器获取文件信息(文件名称、文件路径、文件大小、文件类型)。
- 服务器将文件保存到指定的存储设备中。
- 存储设备将文件保存成功后,服务器将文件信息保存到数据库。
- 服务器返回上传成功消息给客户端。
- 客户端发起下载请求,服务器根据文件ID查询文件信息。
- 服务器从数据库中获取文件信息。
- 服务器根据文件路径从存储设备中获取文件。
- 服务器构建文件资源,并将其返回给客户端。
- 客户端请求下载指定文件,服务器根据文件路径从存储设备中获取文件。
- 服务器设置响应头信息,并构建响应体返回给客户端。
数据表准备
创建数据库表file
- id:主键ID
- file_name:文件名称
- file_path:文件路径
- file_type:文件类型
- file_size:文件大小
CREATE TABLE `file` ( `id` int(11) NOT NULL AUTO_INCREMENT, `file_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `file_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `file_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `file_size` bigint(20) NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1;
File实体类
创建File实体类,并生成getter和setter方法。这里我做出了省略。
public class File implements Serializable { private Integer id; private String fileName; private String filePath; private Integer fileSize; private String fileType; //省略getter,setter }
配置文件保存目录
file.upload-path = E:/upload
FileController编写
注意一定要将文件保存到本地路径后,再进行数据库信息的保存!本上传方法较为简单,非常适合入门级别查看。
@RestController @RequestMapping("/api/v1/file") public class FileController { @Autowired private FileService fileService; @Value("${file.upload-path}") private String uploadPath; //上传功能 @GetMapping("upload") public JsonData uploadFile(@RequestParam("file") MultipartFile file) throws IOException { //获取文件上传名称 String fileName=file.getOriginalFilename(); //获取文件保存全路径 String savePath=uploadPath+"/"+fileName; //获取文件大小 Long fileSize=file.getSize(); //获取文件类型 String fileType=file.getContentType(); java.io.File newFile=new java.io.File(savePath); //TODO 注意要将文件保存到本地路径中 file.transferTo(newFile); File saveFile=new File(); saveFile.setFileName(fileName); saveFile.setFileSize(fileSize); saveFile.setFileType(fileType); saveFile.setFilePath(savePath); fileService.saveFile(saveFile); return JsonData.buildSuccess(); } } //文件下载 @GetMapping("down") public ResponseEntity downFile(@RequestParam Integer id) throws MalformedURLException, UnsupportedEncodingException { //首先根据id,从数据库获取文件信息 File downFile=fileService.selectFileById(id); if (downFile!=null){ String path= downFile.getFilePath(); //本地路径地址转为url编码路径 URI urlPath= Paths.get(path).toUri(); Resource resource=new UrlResource(urlPath); if (resource.exists()){ HttpHeaders headers=new HttpHeaders(); headers.add(HttpHeaders.CONTENT_TYPE,MediaType.APPLICATION_OCTET_STREAM+""); headers.add(HttpHeaders.CONTENT_LENGTH,downFile.getFileSize()+""); //注意文件名处要改为URL编码 headers.add(HttpHeaders.CONTENT_DISPOSITION,"attachment; filename=\"" + URLEncoder.encode(downFile.getFileName(),"utf-8") + "\""); return ResponseEntity.ok().headers(headers).body(resource); } } return ResponseEntity.notFound().build(); }
🌟最终测试
文件上传
数据库成功保存并且本地路径也有当前文件
文件下载
🌟写在最后
有关于SpringBoot实现文件上传、下载功能到此就结束了。感谢大家的阅读,希望大家在评论区对此部分内容散发讨论,便于学到更多的知识。