点击下载《SpringBoot实现文件上传和下载实现全过程》
点击下载《SpringBoot实现文件上传和下载实现全过程(源代码)》
1. 引言
在Web应用中,文件上传和下载是常见的需求。Spring Boot框架提供了强大的支持和便利的API,使得开发者可以轻松地实现文件上传和下载功能。本文将详细介绍如何在Spring Boot应用中实现文件上传和下载,包括实现原理和完整的代码示例。
2. 文件上传下载
- 文件上传: - 当客户端发送文件上传请求时,Spring Boot会接收到一个包含文件的MultipartHttpServletRequest对象。- 在控制器方法中,可以通过参数接收这个MultipartHttpServletRequest对象,并从中获取上传的文件。- Spring Boot会将上传的文件存储到临时目录中,可以通过MultipartFile对象的getOriginalFilename()方法获取文件名,通过getBytes()方法获取文件内容。- 文件上传后,可以将其保存到服务器的持久化存储中,例如本地磁盘、云存储等。
- 文件下载: - 当客户端发送文件下载请求时,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"?><projectxmlns="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>
2.2 配置文件上传大小限制
在
application.yml
文件中,你可以配置文件上传的大小限制。例如,下面的配置允许上传最大为1MB的文件:
server:
port: 18080
spring:
servlet:
multipart:
max-file-size: 1MB
max-request-size: 1MB
2.3 创建上传控制器
创建一个控制器类,用于处理文件上传请求。在这个类中,使用
@PostMapping
注解指定处理POST请求的方法,并使用
@RequestParam("file") MultipartFile file
参数接收上传的文件。
// 导入需要的包和类 importorg.springframework.web.bind.annotation.*;importorg.springframework.web.multipart.MultipartFile;importorg.springframework.http.ResponseEntity;importorg.springframework.http.HttpStatus;importorg.springframework.core.io.Resource;importorg.springframework.core.io.UrlResource;importorg.springframework.core.io.InputStreamResource;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.*;importorg.springframework.web.multipart.*;// 创建文件上传控制器 @RestController@RequestMapping("/api/upload")publicclassFileUploadController{// 处理文件上传请求的POST方法 @PostMapping("/")publicResponseEntity<String>handleFileUpload(@RequestParam("file")MultipartFile file){try{// 获取上传文件的文件名 String fileName = file.getOriginalFilename();// 将文件保存到磁盘或执行其他操作,这里只是简单地将文件保存到静态资源目录下
file.transferTo(newFile("D:/"+ fileName));returnnewResponseEntity<>("文件上传成功!",HttpStatus.OK);}catch(Exception e){returnnewResponseEntity<>("文件上传失败:"+ e.getMessage(),HttpStatus.INTERNAL_SERVER_ERROR);}}}
2.4 创建下载控制器
创建一个控制器类,用于处理文件下载请求。在这个类中,我们将使用
@GetMapping
注解指定处理GET请求的方法,并使用
@RequestParam("filename") String fileName
参数接收要下载的文件名。然后,我们可以使用文件名来获取要下载的文件,并将其作为响应返回给客户端。
为了让Spring Boot能够找到静态资源(如文件),你需要在
src/main/resources
目录下创建一个名为
static
的文件夹,并在其中创建一个名为
files
的文件夹,用于存放要下载的文件。
importorg.springframework.core.io.InputStreamResource;importorg.springframework.core.io.Resource;importorg.springframework.http.*;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.PathVariable;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.core.io.ResourceLoader;importorg.springframework.beans.factory.annotation.Autowired;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importjava.io.IOException;@RestController@RequestMapping("/api/download")publicclassFileDownloadController{privatestaticfinalLogger log =LoggerFactory.getLogger(FileDownloadController.class);@AutowiredprivateResourceLoader resourceLoader;// 处理文件下载请求的GET方法,通过文件名获取文件并返回给客户端下载@GetMapping("/{filename:.+}")publicResponseEntity<Resource>handleFileDownload(@PathVariableString filename)throwsIOException{// 获取要下载的文件的Resource对象,这里假设文件保存在静态资源目录下的files文件夹中Resource resource = resourceLoader.getResource("classpath:static/files/"+ filename);if(resource ==null){returnnewResponseEntity<>(HttpStatus.NOT_FOUND);}// 将文件内容包装为响应体,并设置响应头信息,提示浏览器下载文件而不是打开文件InputStreamResource inputStreamResource =newInputStreamResource(resource.getInputStream());HttpHeaders headers =newHttpHeaders();
headers.add(HttpHeaders.CONTENT_DISPOSITION,"attachment; filename="+ filename);returnResponseEntity.ok().headers(headers).contentType(MediaTypeFactory.getMediaType(resource).get()).body(inputStreamResource);}}
3. 总结
通过以上步骤,你可以在Spring Boot应用中实现文件上传和下载功能。文件上传通过POST请求实现,将文件作为请求的一部分发送到服务器。文件下载通过GET请求实现,根据文件名从服务器上获取文件内容,并通过浏览器下载。在这个过程中,Spring Boot框架提供了丰富的API和便利的配置选项,使得开发者可以轻松地实现这些功能。
点击下载《SpringBoot实现文件上传和下载实现全过程》
点击下载《SpringBoot实现文件上传和下载实现全过程(源代码)》
版权归原作者 孤蓬&听雨 所有, 如有侵权,请联系我们删除。