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说明文件上传成功。

image-20211116230119837

上传完成后,在项目根目录下会创建一个files文件夹,并将上传文件复制到此处。注意如果文件夹中已经存在上传的文件,上传时会抛出文件存在异常FileAlreadyExistsException

image-20211116225401602

2.3.2 文件下载

调用接口下载指定文件时,需要在请求接口时拼接上文件名称作为参数。

image-20211116225839473

使用postman请求下载接口时,接口返回文件,postman会直接解析文件内容,如果无法正确解析则会显示乱码信息。如果在浏览器请求接口时,返回文件时浏览器会弹出下载文件的提示。

猜你喜欢

转载自juejin.im/post/7031185139887505439
今日推荐