专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

SpringBoot的文件上传和下载 springboot文件上传与下载

ins518 2024-10-03 00:04:21 技术文章 12 ℃ 0 评论

前言

  1. 在Spring Boot框架中,实现文件上传与下载功能通常依赖于Spring MVC的MultipartFile接口,该接口简化了文件在客户端与服务器之间传输的过程。为了使这些功能更加完善,我们通常需要设计一个控制器(Controller),它将负责处理用户的HTTP请求,包括文件上传和下载的操作。
  2. 文件上传涉及到接收客户端发送的文件数据,并将其存储在服务器上。在这个过程中,Spring Boot提供了一系列的配置选项,允许我们自定义文件上传的临时目录、最大文件大小等属性,以满足不同的应用需求

Spring Boot中文件上传和下载通用配置

  1. 在Spring Boot应用程序中的文件上传和下载的功能,首先需要在应用的配置文件中(例如application.properties)进行细致的配置。通过spring.servlet.multipart属性集,以限定上传文件的大小、临时文件的存储位置等配置。
  2. 创建文件上传表单页面:在前端创建一个包含文件上传表单的页面,通常使用HTML和表单标签来实现。表单中必须有一个input标签的type属性为file,用户通过这个输入框选择要上传的文件。同时表单需要设置 enctype="multipart/form-data"
  3. 处理文件上传请求: 在后端创建一个Controller来专门处理文件上传请求。此Controller需要能够接收上传的文件,并将文件保存到指定的位置。在Spring Boot中使用@RequestParam注解来接收MultipartFile对象,然后使用其transferTo()方法将文件保存到目标位置。
  4. 提供了文件下载的服务,我们需要创建一个Controller来处理下载请求。该Controller需要根据文件名或其他唯一标识符检索文件的能力,并能够以流的形式将文件内容传递给客户端。在Spring Boot框架中,您可以利用ResponseEntity来构建文件的响应实体,并通过设置适当的HTTP响应头,如Content-Disposition,来指示浏览器以下载方式处理返回的文件内容,从而提供便捷的文件下载体验。

Springboo的文件上传和下载案例

一、文件上传流程和步骤

1、创建上传目录

我们需要在服务器上创建一个目录,用于存储上传的文件。无论是任何操作系统,我们都需要对文件上传的目录具有足够的权限,这样程序可以向其进行读写操作。

2、配置文件上传属性

application.properties或者application.yml’对上文文件进行相关的配置,如上传目录的路径、文件大小限制等。下面以application.properties为例进行配置

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

3、创建文件上传表单页面

在我们文件上传的前端页面中创建一个表单,表单必须支持用户上传文件,注意设置enctype属性

<form action="/fileUpload" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <button type="submit">上传</button>
</form>

4、创建后台的Controller

创建后台的Controller用来处理文件上传请求,并将文件保存到指定相应的的位置。

import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
 
@RestController
public class MyFileUploadController {
 
    @PostMapping("/fileUpload")
    public String handleFileUpload(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return "Please select a file to upload 3KS";
        }
        try {
            byte[] bytes = file.getBytes();
            String uploadDir = "/path/upload/";
            File uploadedFile = new File(uploadDir + file.getOriginalFilename());
            file.transferTo(uploadedFile);
            return "File uploaded successfully!";
        } catch (IOException e) {
            e.printStackTrace();
            return "File upload failed!";
        }
    }
}

二、文件下载流程和步骤

1、创建文件下载接口

我们在后台 创建一个Controller来处理文件下载请求,我们通常根据文件名找到对应的文件,并将其文件的内容以流的形式返回给客户端接受。

import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;
 
@Controller
public class MyFileDownloadController {
 
    private static final String FILE_DIRECTORY = "/path/upload/";
 
    @GetMapping("/fileDownload/{downloadFileName:.+}")
    @ResponseBody
    public ResponseEntity<Resource> downloadFile(@PathVariable String downloadFileName) {
        Path filePath = Paths.get(FILE_DIRECTORY).resolve(downloadFileName).normalize();
        try {
            Resource resource = new org.springframework.core.io.UrlResource(filePath.toUri());
            if (resource.exists() || resource.isReadable()) {
                return ResponseEntity.ok()
                     .contentType(MediaType.APPLICATION_OCTET_STREAM)
                      .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; downloadFileName=\"" + resource.getFilename() + "\"")
                        .body(resource);
            } else {
                return ResponseEntity.notFound().build();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
            return ResponseEntity.status(500).build();
        }
    }
}

小结

通过以上编写步骤基本就可以简单的实现文件上传和下载,文件上传和下载会有很多实现方式,大家可以多多交流。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表