Spring Boot实现 文件上传与下载,包括前端界面实现
效果展示:
新建SpringBoot工程
(略...)
参数配置
项目创建完成之后,需要设置一些必要的参数,打开项目resources
目录下配置文件application.properties
,在其中添加以下参数:
server.port=80## MULTIPART (MultipartProperties)
# 开启 multipart 上传功能
spring.servlet.multipart.enabled=true
# 文件写入磁盘的阈值
spring.servlet.multipart.file-size-threshold=2KB
# 最大文件大小
spring.servlet.multipart.max-file-size=200MB
# 最大请求大小
spring.servlet.multipart.max-request-size=215MB## 文件存储所需参数
# 所有通过 REST APIs 上传的文件都将存储在此目录下
file.upload-dir=./uploads
其中file.upload-dir=./uploads
参数为自定义的参数,创建FileProperties.java
POJO类,使配置参数可以自动绑定到POJO类。
import org.springframework.boot.context.properties.ConfigurationProperties;@ConfigurationProperties(prefix = "file")
public class FileProperties {private String uploadDir;public String getUploadDir() {return uploadDir;}public void setUploadDir(String uploadDir) {this.uploadDir = uploadDir;}
}
然后在@SpringBootApplication
注解的类中添加@EnableConfigurationProperties
注解以开启ConfigurationProperties
功能。
SpringBootFileApplication.java
@SpringBootApplication
@EnableConfigurationProperties({FileProperties.class
})
public class SpringBootFileApplication {public static void main(String[] args) {SpringApplication.run(SpringBootFileApplication.class, args);}
}
配置完成,以后若有file
前缀开头的参数需要配置,可直接在application.properties
配置文件中配置并更新FileProperties.java
即可。
另外再创建一个上传文件成功之后的Response
响应实体类UploadFileResponse.java
及异常类FileException.java
来处理异常信息。
UploadFileResponse.java
public class UploadFileResponse {private String fileName;private String fileDownloadUri;private String fileType;private long size;public UploadFileResponse(String fileName, String fileDownloadUri, String fileType, long size) {this.fileName = fileName;this.fileDownloadUri = fileDownloadUri;this.fileType = fileType;this.size = size;}// getter and setter ...
}
FileException.java
public class FileException extends RuntimeException{public FileException(String message) {super(message);}public FileException(String message, Throwable cause) {super(message, cause);}
}
创建接口
下面需要创建文件上传下载所需的 REST APIs 接口。创建文件FileController.java
。
import com.james.sample.file.dto.UploadFileResponse;
import com.james.sample.file.service.FileService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;@RestController
public class FileController {private static final Logger logger = LoggerFactory.getLogger(FileController.class);@Autowiredprivate FileService fileService;@PostMapping("/uploadFile")public UploadFileResponse uploadFile(@RequestParam("file") MultipartFile file){String fileName = fileService.storeFile(file);String fileDownloadUri = ServletUriComponentsBuilder.fromCurrentContextPath().path("/downloadFile/").path(fileName).toUriString();return new UploadFileResponse(fileName, fileDownloadUri,file.getContentType(), file.getSize());}@PostMapping("/uploadMultipleFiles")public List<UploadFileResponse> uploadMultipleFiles(@RequestParam("files") MultipartFile[] files) {return Arrays.stream(files).map(this::uploadFile).collect(Collectors.toList());}@GetMapping("/downloadFile/{fileName:.+}")public ResponseEntity<Resource> downloadFile(@PathVariable String fileName, HttpServletRequest request) {// Load file as ResourceResource resource = fileService.loadFileAsResource(fileName);// Try to determine file's content typeString contentType = null;try {contentType = request.getServletContext().getMimeType(resource.getFile().getAbsolutePath());} catch (IOException ex) {logger.info("Could not determine file type.");}// Fallback to the default content type if type could not be determinedif(contentType == null) {contentType = "application/octet-stream";}return ResponseEntity.ok().contentType(MediaType.parseMediaType(contentType)).header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"").body(resource);}
}
FileController
类在接收到用户的请求后,使用FileService
类提供的storeFile()
方法将文件写入到系统中进行存储,其存储目录就是之前在application.properties
配置文件中的file.upload-dir
参数的值./uploads
。
下载接口downloadFile()
在接收到用户请求之后,使用FileService
类提供的loadFileAsResource()
方法获取存储在系统中文件并返回文件供用户下载。
FileService.java
import com.james.sample.file.exception.FileException;
import com.james.sample.file.property.FileProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;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;@Service
public class FileService {private final Path fileStorageLocation; // 文件在本地存储的地址@Autowiredpublic FileService(FileProperties fileProperties) {this.fileStorageLocation = Paths.get(fileProperties.getUploadDir()).toAbsolutePath().normalize();try {Files.createDirectories(this.fileStorageLocation);} catch (Exception ex) {throw new FileException("Could not create the directory where the uploaded files will be stored.", ex);}}/*** 存储文件到系统** @param file 文件* @return 文件名*/public String storeFile(MultipartFile file) {// Normalize file nameString fileName = StringUtils.cleanPath(file.getOriginalFilename());try {// Check if the file's name contains invalid charactersif(fileName.contains("..")) {throw new FileException("Sorry! Filename contains invalid path sequence " + fileName);}// Copy file to the target location (Replacing existing file with the same name)Path targetLocation = this.fileStorageLocation.resolve(fileName);Files.copy(file.getInputStream(), targetLocation, StandardCopyOption.REPLACE_EXISTING);return fileName;} catch (IOException ex) {throw new FileException("Could not store file " + fileName + ". Please try again!", ex);}}/*** 加载文件* @param fileName 文件名* @return 文件*/public Resource loadFileAsResource(String fileName) {try {Path filePath = this.fileStorageLocation.resolve(fileName).normalize();Resource resource = new UrlResource(filePath.toUri());if(resource.exists()) {return resource;} else {throw new FileException("File not found " + fileName);}} catch (MalformedURLException ex) {throw new FileException("File not found " + fileName, ex);}}
}
代码下载
Spring Boot实现 文件上传与下载,包括前端界面实现相关推荐
- 项目_功能模块_基于Spring Boot的文件上传下载功能的设计与实现
文章目录 基于Spring Boot的文件上传下载功能模块的设计与实现 1.前言 2.技术栈 3.关键源码 4.实现效果 4.1.登录 4.2.文件列表 4.3.上传文件测试 4.3.1.测试图片 4 ...
- Mr.张小白(案例:基于Spring MVC实现文件上传和下载)
基于Spring MVC实现文件上传和下载 一.步骤 1.引入相关依赖pom.xml <?xml version="1.0" encoding="UTF-8&quo ...
- springboot 上传文件解析入库_十五分钟用Spring Boot实现文件上传功能
Spring Boot最好的学习方法就是实战训练,今天我们用很短的时间启动我们第一个Spring Boot应用,并且制作一个文件上传系统, 用户可以将本地文件上传到服务器上.我将假设读者为几乎零基础, ...
- Spring MVC的文件上传和下载以及拦截器
一.文件上传 在使用form表单进行文件上传时,必须将method设置为 post,并将enctype设置为multipart/form-data.只有这样设置,浏览器才会将需要上传的文件已二进制数据 ...
- 【Spring】SpringMVC文件上传与下载
对于上传功能,我们在项目中是经常会用到的,比如用户注册的时候,上传用户头像,这个时候就会使用到上传的功能.而对于下载,使用场景也很常见,比如我们项目中有个使用说明是是pdf版的,会提供给用户进行下载的 ...
- VUE+Spring Boot,文件上传el-upload报错--Current request is not a multipart request,记录
做了个简单的文件上传功能,测试时发现报错Current request is not a multipart request,网上查了很多办法,记录一下: 1.最多的:当前请求不是multipart ...
- SpringBoot 文件上传、下载、设置大小
本文使用SpringBoot的版本为2.0.3.RELEASE 1.上传单个文件 ①html对应的提交表单 <form action="uploadFile" method= ...
- 全栈开发实战|Spring Boot文件上传与下载
文件上传与下载是Web应用开发中常用的功能之一.接下来我们将讨论如何在Spring Boot的Web应用开发中,如何实现文件的上传与下载. 01.Spring Boot文件上传与下载 在实际的Web应 ...
- SpringBoot下文件上传与下载的实现
原文:http://blog.csdn.net/colton_null/article/details/76696674 SpringBoot后台如何实现文件上传下载? 最近做的一个项目涉及到文件上传 ...
- 超详细的文件上传和下载(Spring Boot)
超详细的文件上传和下载 前言Ⅰ:@RequestParam和@RequestPart的区别 @RequestPart @RequestPart这个注解用在multipart/form-data表单提交 ...
最新文章
- 【Qt】解决在linux上使用Qt的媒体模块(Qt += multimedia)缺少模块multimedia的问题
- 为什么总线要用一根来表示一bit
- kax格式怎么导入不了pr_pr如何导入.mogrt文件 pr模板导入教程
- vue复选框组件自定义对勾_vue2.0中ckeckbox(复选框)的使用心得,及对click事件和change的理解...
- SQL Server 计算汉字笔画函数
- python气象包_Python-Cartopy包: 地图投影
- 成形滤波器和匹配滤波器
- AI——六(图层、蒙版)
- Vmware中Linux 虚拟终端之间 无法切换 解决方法
- 【你好,windows】Windows 10 20H2 19042.630专业工作站纯净版2020.12.1
- 2021-04-23
- 复测前端BUG一定要清缓存吗?
- java课程设计-音乐播放器,基于java的音乐播放器设计.doc
- Glade+GTK+ 实现通讯录信息管理系统图形界面软件开发
- SQL渗透与防御——(三)SQL盲注
- Nodejs使用实例——网站登录验证
- C++实现的Socket接口实现自定义协议通信
- ACDC隔离电源设计手机适配器智能家居供电5V1A设计方案
- 计算2000年1月1日到2008年1月1日相距多少天。(注意闰年) 思路:循环指定的次数(根据年数确定), 计算每年的天数进行累加求和就OK了 (闰年366天,平年365天)<闰年的判断条件:能被4
- 快手宣布将实行大小周,打工人何时能正常上下班?
热门文章
- 14. CSS 列表
- java访问rabbitMQ 一
- oracle exp-00011的解决办法
- java崩溃停在崩溃代码上_通过编写Java代码让Jvm崩溃
- href=“javascript:void(0);”和href=void(change_code(this));
- 2017.10.16 模拟赛
- 20155313 2016-2017-2 《Java程序设计》第十周学习总结
- cassandra 3.x官方文档(5)---探测器
- 用ASP.NET开发胖客户端应用程序
- HRBEU 字符串 1003