Spring Boot中实现文件上传和下载
「这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战」
1. 文件上传和下载请求
Web项目中,文件的上传和下载服务也是基于HTTP请求的,文件上传由于需要向服务接口提交数据,可以使用POST的请求方式,而文件的下载只是获取数据,因此可以使用GET请求方式。
基于Spring Boot框架的项目中实现文件的上传和下载还是比较简单的,只需要提供上传和下载的服务接口,在文件保存时将其放入指定的路径,获取文件时再从指定路径读取文件即可。
在本地运行项目时,需要指定本地的文件路径作为文件存储位置。
2. 基于Spring Boot的Web项目
上传和下载都是在Web服务接口中完成的,因此在创建Spring Boot项目时只需要引入web依赖信息即可。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2.1 上传和下载控制器
控制器controller层用来定义服务接口,文件上传和下载分别通过一个POST类型和GET类型的请求接口实现。
对于文件上传接口,接口使用MultipartFile
对象作为参数,在使用postman等工具请求接口时选择文件后,服务接口接收文件参数数据。
而文件下载接口中,需要提供下载文件的名称,接口会根据文件名称在资源路径中寻找指定文件并通过结果返回。
//文件上传接口
@RequestMapping(value = "/upload",method = RequestMethod.POST)
public String upload(MultipartFile file){
...
}
//文件下载接口
@RequestMapping(value = "/downloadFile/{fileName}", method = RequestMethod.GET)
public Resource getFile(@PathVariable("fileName") String fileName){
...
}
2.2 上传和下载逻辑实现
2.2.1 初始化文件存放路径
在本地实现文件上传和下载时,需要指定一个路径作为文件池,并在项目启动时将文件夹创建好。
Paths.get("file")
,相对路径,指定一个当前项目下的file文件夹路径Files.createDirectory(path)
,对指定的路径创建文件夹@PostConstruct
表示在当前类初始化后自动执行
//指定文件夹路径并创建
Path path = Paths.get("file");
@PostConstruct
@Override
public void init() {
try {
Files.createDirectory(path);
} catch (IOException e) {
e.printStackTrace();
}
}
2.2.2 上传文件到路径
创建好指定的文件存放路径文件夹后,上传逻辑只需要将接收到的文件数据赋值到指定路径后即可。
file.getInputStream()
,接收文件参数的对应字节流this.path.resolve(file.getOriginalFilename())
,指定的path路径拼接接收文件的原始名称作为文件的路径信息Files.copy()
,复制文件的方法
//上传逻辑,将接收的文件以字节流方式复制到指定路径
@Override
public void upload(MultipartFile file) {
try {
Files.copy(file.getInputStream(),this.path.resolve(file.getOriginalFilename()));
} catch (IOException e) {
e.printStackTrace();
}
}
2.2.3 从路径中下载文件
文件的下载逻辑是根据指定的文件名称到文件资源文件夹中获取,如果存在则返回文件。
this.path.resolve(fileName)
,构建文件全路径new UrlResource(file.toUri())
,根据文件路径创建URL源resource.exists() && resource.isReadable()
,文件存在并且可读时返回
//下载文件逻辑
@Override
public Resource downloadFile(String fileName) {
Path file = this.path.resolve(fileName);
try {
Resource resource = new UrlResource(file.toUri());
if(resource.exists() && resource.isReadable()){
return resource;
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
2.3 请求上传和下载接口
业务逻辑实现后,可以使用postman来实现HTTP请求调用。
2.3.1 文件上传
首先请求文件上传服务接口,请求接口并选择本地文件作为body体中的参数,点击send发起请求,接口返回success说明文件上传成功。
上传完成后,在项目根目录下会创建一个files文件夹,并将上传文件复制到此处。注意如果文件夹中已经存在上传的文件,上传时会抛出文件存在异常FileAlreadyExistsException
。
2.3.2 文件下载
调用接口下载指定文件时,需要在请求接口时拼接上文件名称作为参数。
使用postman请求下载接口时,接口返回文件,postman会直接解析文件内容,如果无法正确解析则会显示乱码信息。如果在浏览器请求接口时,返回文件时浏览器会弹出下载文件的提示。
转载自:https://juejin.cn/post/7031185139887505439