基于SpringBoot实现文件上传和下载(详细讲解And附完整代码)

简介: 基于SpringBoot实现文件上传和下载(详细讲解And附完整代码)

一、基于SpringBoot实现文件上传和下载基于理论

在Spring Boot中实现文件上传和下载通常涉及到使用Spring MVC的MultipartFile类来处理文件上传,同时配置一个Controller来处理上传和下载请求。

在Spring Boot中实现文件上传和下载通常遵循以下步骤:

  1. 配置文件上传位置和大小限制: 首先,需要在Spring Boot应用的配置文件(如application.properties)中配置文件上传的位置和大小限制。这通常涉及设置spring.servlet.multipart相关属性。你可以指定上传文件的最大大小、临时文件路径等。
  2. 创建文件上传表单页面: 在前端创建一个包含文件上传表单的页面,通常使用HTML和表单标签来实现。表单中必须有一个input标签的type属性为file,用户通过这个输入框选择要上传的文件。
  3. 处理文件上传请求: 在后端创建一个Controller来处理文件上传请求。这个Controller需要能够接收上传的文件,并将文件保存到指定的位置。在Spring Boot中,你可以使用@RequestParam注解来接收MultipartFile对象,然后使用其transferTo()方法将文件保存到目标位置。
  4. 提供文件下载接口: 创建另一个Controller来处理文件下载请求。这个Controller需要能够根据文件名或其他标识符找到对应的文件,并将其内容以流的形式返回给客户端。在Spring Boot中,你可以使用ResponseEntity来封装文件的响应,并设置适当的HTTP头部,使浏览器能够下载文件。

二、详细操作步骤

文件上传步骤:

  1. 创建上传目录: 在服务器上创建一个目录,用于存储上传的文件。确保这个目录具有足够的权限,以便应用程序可以向其中写入文件。
  2. 配置文件上传属性:application.properties文件中配置文件上传的属性,包括上传目录的路径、文件大小限制等。
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
  1. 创建文件上传表单: 在前端页面中创建一个表单,允许用户选择要上传的文件。
<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <button type="submit">Upload</button>
</form>

   4.处理文件上传请求: 创建一个Controller来处理文件上传请求,并将文件保存到指定的位置。

import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
 
@RestController
public class FileUploadController {
 
    @PostMapping("/upload")
    public String handleFileUpload(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return "Please select a file to upload.";
        }
        try {
            byte[] bytes = file.getBytes();
            String uploadDir = "/path/to/upload/directory/";
            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 FileDownloadController {
 
    private static final String FILE_DIRECTORY = "/path/to/upload/directory/";
 
    @GetMapping("/download/{fileName:.+}")
    @ResponseBody
    public ResponseEntity<Resource> downloadFile(@PathVariable String fileName) {
        Path filePath = Paths.get(FILE_DIRECTORY).resolve(fileName).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; filename=\"" + resource.getFilename() + "\"")
                        .body(resource);
            } else {
                return ResponseEntity.notFound().build();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
            return ResponseEntity.status(500).build();
        }
    }
}

三、前后端交互原理解释

<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <button type="submit">Upload</button>
</form>

在这里对代码进行详细的注释:

客户端实现发送一个 POST 请求到 `/upload` 路径通常是通过浏览器中的 HTML 表单来完成的。在你提供的 HTML 代码中,已经有一个表单,它会将文件上传到服务器。

让我们解释一下这段 HTML 代码:

- `<form>` 标签定义了一个表单,它将会提交数据到指定的 URL(在 `action` 属性中定义)。在这里,`action` 属性的值是 `/upload`,意味着表单将数据提交给服务器上的 `/upload` 路径。

- `method` 属性定义了表单的提交方法。在这里,设置为 `post`,表示将使用 POST 请求提交数据。

- `enctype` 属性定义了表单数据编码的类型。在这里,设置为 `multipart/form-data`,用于支持文件上传。

- `<input type="file" name="file">` 定义了一个文件选择输入框,允许用户选择要上传的文件。`name` 属性设置为 `file`,这个值与后端控制器方法中的 `@RequestParam("file")` 对应,用于接收上传的文件。

- `<button type="submit">Upload</button>` 定义了一个提交按钮,当用户点击它时,表单将被提交到服务器上的 `/upload` 路径。

因此,当用户在浏览器中选择一个文件并点击“上传”按钮时,浏览器将会发送一个 POST 请求到服务器上的 `/upload` 路径,上传文件数据将随请求一起发送到服务器,后端控制器将接收这个请求并处理文件上传逻辑。

这个表单指定了一个提交目标为/upload的POST请求,并设置了enctype属性为multipart/form-data,以支持文件上传。

当用户在浏览器中选择要上传的文件并点击“上传”按钮时,浏览器将选定的文件作为HTTP请求的一部分发送到服务器。

在服务器端,Spring Boot应用中的FileUploadController接收这个上传请求,并通过@RequestParam("file") MultipartFile file注解来接收上传的文件。Spring Boot中的MultipartFile对象代表了上传的文件,你可以通过它来获取文件名、文件类型、文件内容等信息,并使用transferTo()方法将文件保存到服务器的指定位置。

在这个示例中,上传的文件被保存在服务器的指定目录下,具体路径由变量uploadDir指定。

// 代码存储路径
String uploadDir = "/path/to/upload/directory/";
File uploadedFile = new File(uploadDir + file.getOriginalFilename());
file.transferTo(uploadedFile);

所以,上传的文件实际上是存储在服务器的文件系统中,而不是前端。一旦文件被上传到服务器,后端应用就可以对它进行处理,例如存储到数据库中,或者提供下载接口让用户下载该文件。

四、小结

以上内容总结如下:

1. Spring Boot中实现文件上传和下载:

  - 在Spring Boot中,文件上传和下载通常涉及使用Spring MVC的`MultipartFile`类处理文件上传,并配置一个Controller来处理上传和下载请求。

2.文件上传步骤:

  - 配置文件上传位置和大小限制。

  - 创建文件上传表单页面,使用HTML表单标签,其中包含一个`input`标签的`type`属性为`file`。

  - 后端Controller处理文件上传请求,使用`@RequestParam("file") MultipartFile file`注解来接收上传的文件,并将文件保存到指定位置。

3. 文件下载步骤:

  - 创建另一个Controller处理文件下载请求,根据文件名找到对应的文件,并将其内容以流的形式返回给客户端。

4. 在前端使用Controller作为映射路径:

  - 配置Spring Boot以解析静态资源,并将HTML文件放置在静态资源目录下。

  - 在控制器中定义文件上传路径,使用`@GetMapping`或`@RequestMapping`注解指定控制器路径作为映射路径。

  - 在HTML表单中使用控制器路径,将控制器路径作为表单的`action`属性值。

通过以上步骤,你可以在Spring Boot中实现文件上传和下载,并在前端使用控制器作为映射路径,从而建立起清晰的路由结构。


相关文章
|
2月前
|
前端开发 Java easyexcel
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
145 8
|
3月前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
165 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
2月前
|
缓存 监控 Java
|
2月前
|
缓存 监控 Java
|
3月前
|
easyexcel Java UED
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
在SpringBoot环境中,为了优化大量数据的Excel导出体验,可采用异步方式处理。具体做法是将数据拆分后利用`CompletableFuture`与`ThreadPoolTaskExecutor`并行导出,并使用EasyExcel生成多个Excel文件,最终将其压缩成ZIP文件供下载。此方案提升了导出效率,改善了用户体验。代码示例展示了如何实现这一过程,包括多线程处理、模板导出及资源清理等关键步骤。
|
3月前
|
Java BI API
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
这篇文章介绍了如何在Spring Boot项目中整合iTextPDF库来导出PDF文件,包括写入大文本和HTML代码,并分析了几种常用的Java PDF导出工具。
728 0
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
|
3月前
|
JSON NoSQL Java
springBoot:jwt&redis&文件操作&常见请求错误代码&参数注解 (九)
该文档涵盖JWT(JSON Web Token)的组成、依赖、工具类创建及拦截器配置,并介绍了Redis的依赖配置与文件操作相关功能,包括文件上传、下载、删除及批量删除的方法。同时,文档还列举了常见的HTTP请求错误代码及其含义,并详细解释了@RequestParam与@PathVariable等参数注解的区别与用法。
|
3月前
|
监控 Java 开发者
掌握SpringBoot扩展接口:提升代码优雅度的16个技巧
【10月更文挑战第20天】 SpringBoot以其简化配置和快速开发而受到开发者的青睐。除了基本的CRUD操作外,SpringBoot还提供了丰富的扩展接口,让我们能够更灵活地定制和扩展应用。以下是16个常用的SpringBoot扩展接口,掌握它们将帮助你写出更加优雅的代码。
109 0
|
3月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
202 1
|
2月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
133 62

热门文章

最新文章