SpringBoot实现文件的上传、下载和预览功能
引言
在Spring Boot项目中实现文件的上传、下载和预览功能,可以通过使用Spring MVC的MultipartFile接口来处理文件上传,并使用HttpServletResponse或Resource来实现文件下载和预览。下面是如何实现这些功能的完整示例。
1. 引入依赖
确保在pom.xml中引入了Spring Boot的相关依赖。通常情况下,Spring Boot Starter Web已经包含了必要的依赖。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
2. 创建文件上传、下载和预览的Controller
你可以创建一个FileController
来处理文件的上传、下载和预览。
import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.Resource; import org.springframework.core.io.UrlResource; 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.*; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.support.ServletUriComponentsBuilder; import java.io.IOException; import java.net.MalformedURLException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; @Controller @RequestMapping("/files") public class FileController { // 文件保存路径(可以通过配置文件进行配置) @Value("${file.upload-dir}") private String fileUploadDir; // 文件上传 @PostMapping("/upload") @ResponseBody public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException { // 获取文件名并且保存文件 String fileName = file.getOriginalFilename(); Path targetLocation = Paths.get(fileUploadDir).resolve(fileName); Files.copy(file.getInputStream(), targetLocation, StandardCopyOption.REPLACE_EXISTING); // 返回文件下载的URL String fileDownloadUri = ServletUriComponentsBuilder.fromCurrentContextPath() .path("/files/download/") .path(fileName) .toUriString(); return "File uploaded successfully: " + fileDownloadUri; } // 文件下载 @GetMapping("/download/{fileName}") public ResponseEntity<Resource> downloadFile(@PathVariable String fileName) throws MalformedURLException { Path filePath = Paths.get(fileUploadDir).resolve(fileName).normalize(); Resource resource = new UrlResource(filePath.toUri()); if (!resource.exists()) { return ResponseEntity.notFound().build(); } return ResponseEntity.ok() .contentType(MediaType.APPLICATION_OCTET_STREAM) .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"") .body(resource); } // 文件预览(主要针对图片、PDF等可以直接在浏览器中显示的文件) @GetMapping("/preview/{fileName}") public ResponseEntity<Resource> previewFile(@PathVariable String fileName) throws MalformedURLException { Path filePath = Paths.get(fileUploadDir).resolve(fileName).normalize(); Resource resource = new UrlResource(filePath.toUri()); if (!resource.exists()) { return ResponseEntity.notFound().build(); } String contentType = "application/octet-stream"; try { contentType = Files.probeContentType(filePath); } catch (IOException e) { e.printStackTrace(); } return ResponseEntity.ok() .contentType(MediaType.parseMediaType(contentType)) .body(resource); } }
3. 配置文件上传目录
在application.properties
或application.yml
中配置文件的上传路径:
file.upload-dir=C:/uploads
或者使用application.yml
:
file: upload-dir: C:/uploads
你可以将路径配置为你项目的目录,也可以指定到服务器的某个位置。
4. 创建上传目录
确保在你的系统上已经创建了配置文件中指定的上传目录,比如C:/uploads
。如果没有创建,可以通过代码在项目启动时自动创建:
import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @Component public class FileUploadDirectoryInitializer implements CommandLineRunner { @Value("${file.upload-dir}") private String fileUploadDir; @Override public void run(String... args) throws Exception { Path uploadPath = Paths.get(fileUploadDir); if (!Files.exists(uploadPath)) { Files.createDirectories(uploadPath); } } }
5. 测试上传、下载和预览
5.1 文件上传
你可以使用Postman、cURL或者前端页面来测试文件上传功能。上传文件的URL为:
POST http://localhost:8080/files/upload
参数名称为file
。
5.2 文件下载
你可以通过以下URL下载文件:
GET http://localhost:8080/files/download/{fileName}
其中{fileName}
是文件的名称。
5.3 文件预览
你可以通过以下URL预览文件(如图片或PDF):
GET http://localhost:8080/files/preview/{fileName}
6. 处理大文件上传
对于大文件上传,Spring Boot默认的最大上传文件大小可能不满足需求,可以通过以下配置进行调整:
spring.servlet.multipart.max-file-size=100MB spring.servlet.multipart.max-request-size=100MB
或者在application.yml
中:
spring: servlet: multipart: max-file-size: 100MB max-request-size: 100MB
7. 文件预览类型支持
通常情况下,浏览器支持预览的文件类型包括图片(如jpeg
、png
)、PDF、文本文件等。如果文件类型不被浏览器支持,通常可以通过文件下载的方式处理。
8. 文件删除功能(可选)
你也可以添加一个删除文件的接口,来删除已上传的文件:
// 文件删除 @DeleteMapping("/delete/{fileName}") @ResponseBody public String deleteFile(@PathVariable String fileName) throws IOException { Path filePath = Paths.get(fileUploadDir).resolve(fileName).normalize(); Files.deleteIfExists(filePath); return "File deleted successfully"; }
以上就是SpringBoot实现文件的上传、下载和预览功能的详细内容,更多关于SpringBoot文件上传、下载和预览的资料请关注脚本之家其它相关文章!
相关文章
解决java.lang.NullPointerException报错以及分析出现的几种原因
这篇文章介绍了解决java.lang.NullPointerException报错的方法,以及分析出现的几种原因。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-12-12详解SpringMVC组件之HandlerMapping(一)
这篇文章主要介绍了详解SpringMVC组件之HandlerMapping(一),HandlerMapping组件是Spring MVC核心组件,用来根据请求的request查找对应的Handler,在Spring MVC中,有各式各样的Web请求,每个请求都需要一个对应的Handler来处理,需要的朋友可以参考下2023-08-08如何利用Java Agent 做Spring MVC Controller 层的出参入参打印日志
本文介绍了如何使用JavaAgent进行Spring MVC Controller层的出参入参打印日志,首先,建立了一个包含javassist和fastJSON依赖的Agent jar工程,并创建了一个Agent类,然后,编译并部署了这个Agent jar,最后,在Demo Web工程中启用Agent以实现日志打印2024-11-11java序列化与ObjectOutputStream和ObjectInputStream的实例详解
这篇文章主要介绍了java序列化与ObjectOutputStream和ObjectInputStream的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下2017-09-09SpringSecurity自定义资源拦截规则及登录界面跳转问题
这篇文章主要介绍了SpringSecurity自定义资源拦截规则及登录界面跳转问题,我们想要自定义认证逻辑,就需要创建一些原来不存在的bean,这个时候就可以使@ConditionalOnMissingBean注解,本文给大家介绍的非常详细,需要的朋友参考下吧2023-12-12MyBatisPlus+Spring实现声明式事务的方法实现
本文主要介绍了MyBatisPlus+Spring实现声明式事务的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2024-07-07使用springboot时,解决@Scheduled定时器遇到的问题
这篇文章主要介绍了使用springboot时,解决@Scheduled定时器遇到的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-11-11
最新评论