当前位置:   article > 正文

SpringBoot实现文件上传和下载实现全过程(值得珍藏)_springboot 文件上传下载

springboot 文件上传下载

点击下载《SpringBoot实现文件上传和下载实现全过程》
点击下载《SpringBoot实现文件上传和下载实现全过程(源代码)》

1. 引言

在Web应用中,文件上传和下载是常见的需求。Spring Boot框架提供了强大的支持和便利的API,使得开发者可以轻松地实现文件上传和下载功能。本文将详细介绍如何在Spring Boot应用中实现文件上传和下载,包括实现原理和完整的代码示例。
在这里插入图片描述

2. 文件上传下载

  1. 文件上传
    • 当客户端发送文件上传请求时,Spring Boot会接收到一个包含文件的MultipartHttpServletRequest对象。
    • 在控制器方法中,可以通过参数接收这个MultipartHttpServletRequest对象,并从中获取上传的文件。
    • Spring Boot会将上传的文件存储到临时目录中,可以通过MultipartFile对象的getOriginalFilename()方法获取文件名,通过getBytes()方法获取文件内容。
    • 文件上传后,可以将其保存到服务器的持久化存储中,例如本地磁盘、云存储等。
  2. 文件下载
    • 当客户端发送文件下载请求时,Spring Boot会根据请求的URL找到对应的文件。
    • 找到文件后,需要将文件的内容写入到Response的输出流中,为了防止浏览器解析,需要在响应头中设置正确的MIME类型(Content-Type)。
    • 如果要实现断点续传功能,需要根据文件的元数据信息判断是否已经下载过该文件,如果已经下载过,则直接返回已存在的文件内容即可。

2.1 添加依赖

首先,确保你的pom.xml文件中包含了Spring Boot的Web Starter依赖。这个依赖会包含实现文件上传所需的Servlet和相关类。
JDK版本:java17

<?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>3.2.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>fileOperate</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>fileOperate</name>
    <description>fileOperate</description>
    <properties>
        <java.version>8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

2.2 配置文件上传大小限制

application.yml文件中,你可以配置文件上传的大小限制。例如,下面的配置允许上传最大为1MB的文件:

server:
  port: 18080

spring:
  servlet:
    multipart:
      max-file-size: 1MB
      max-request-size: 1MB
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2.3 创建上传控制器

创建一个控制器类,用于处理文件上传请求。在这个类中,使用@PostMapping注解指定处理POST请求的方法,并使用@RequestParam("file") MultipartFile file参数接收上传的文件。

// 导入需要的包和类  
import org.springframework.web.bind.annotation.*;  
import org.springframework.web.multipart.MultipartFile;  
import org.springframework.http.ResponseEntity;  
import org.springframework.http.HttpStatus;  
import org.springframework.core.io.Resource;  
import org.springframework.core.io.UrlResource;  
import org.springframework.core.io.InputStreamResource;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.stereotype.Controller;  
import org.springframework.web.bind.annotation.*;  
import org.springframework.web.multipart.*;
   
  
// 创建文件上传控制器  
@RestController  
@RequestMapping("/api/upload")  
public class FileUploadController {  
    // 处理文件上传请求的POST方法  
    @PostMapping("/")  
    public ResponseEntity<String> handleFileUpload(@RequestParam("file") MultipartFile file) {  
        try {  
            // 获取上传文件的文件名  
            String fileName = file.getOriginalFilename();  
            // 将文件保存到磁盘或执行其他操作,这里只是简单地将文件保存到静态资源目录下  
            file.transferTo(new File("D:/" + fileName));  
            return new ResponseEntity<>("文件上传成功!", HttpStatus.OK);  
        } catch (Exception e) {  
            return new ResponseEntity<>("文件上传失败:" + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);  
        }  
    }  
}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

2.4 创建下载控制器

创建一个控制器类,用于处理文件下载请求。在这个类中,我们将使用@GetMapping注解指定处理GET请求的方法,并使用@RequestParam("filename") String fileName参数接收要下载的文件名。然后,我们可以使用文件名来获取要下载的文件,并将其作为响应返回给客户端。

为了让Spring Boot能够找到静态资源(如文件),你需要在src/main/resources目录下创建一个名为static的文件夹,并在其中创建一个名为files的文件夹,用于存放要下载的文件。

import org.springframework.core.io.InputStreamResource;
import org.springframework.core.io.Resource;
import org.springframework.http.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.core.io.ResourceLoader;
import org.springframework.beans.factory.annotation.Autowired;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;

@RestController
@RequestMapping("/api/download")
public class FileDownloadController {

    private static final Logger log = LoggerFactory.getLogger(FileDownloadController.class);

    @Autowired
    private ResourceLoader resourceLoader;

    // 处理文件下载请求的GET方法,通过文件名获取文件并返回给客户端下载
    @GetMapping("/{filename:.+}")
    public ResponseEntity<Resource> handleFileDownload(@PathVariable String filename) throws IOException {
        // 获取要下载的文件的Resource对象,这里假设文件保存在静态资源目录下的files文件夹中
        Resource resource = resourceLoader.getResource("classpath:static/files/" + filename);
        if (resource == null) {
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        }
        // 将文件内容包装为响应体,并设置响应头信息,提示浏览器下载文件而不是打开文件
        InputStreamResource inputStreamResource = new InputStreamResource(resource.getInputStream());
        HttpHeaders headers = new HttpHeaders();
        headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + filename);
        return ResponseEntity.ok()
                .headers(headers)
                .contentType(MediaTypeFactory.getMediaType(resource).get())
                .body(inputStreamResource);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

3. 总结

通过以上步骤,你可以在Spring Boot应用中实现文件上传和下载功能。文件上传通过POST请求实现,将文件作为请求的一部分发送到服务器。文件下载通过GET请求实现,根据文件名从服务器上获取文件内容,并通过浏览器下载。在这个过程中,Spring Boot框架提供了丰富的API和便利的配置选项,使得开发者可以轻松地实现这些功能。

点击下载《SpringBoot实现文件上传和下载实现全过程》
点击下载《SpringBoot实现文件上传和下载实现全过程(源代码)》

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/902232
推荐阅读
相关标签
  

闽ICP备14008679号