效果展示:

新建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.javaPOJO类,使配置参数可以自动绑定到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实现 文件上传与下载,包括前端界面实现相关推荐

  1. 项目_功能模块_基于Spring Boot的文件上传下载功能的设计与实现

    文章目录 基于Spring Boot的文件上传下载功能模块的设计与实现 1.前言 2.技术栈 3.关键源码 4.实现效果 4.1.登录 4.2.文件列表 4.3.上传文件测试 4.3.1.测试图片 4 ...

  2. Mr.张小白(案例:基于Spring MVC实现文件上传和下载)

    基于Spring MVC实现文件上传和下载 一.步骤 1.引入相关依赖pom.xml <?xml version="1.0" encoding="UTF-8&quo ...

  3. springboot 上传文件解析入库_十五分钟用Spring Boot实现文件上传功能

    Spring Boot最好的学习方法就是实战训练,今天我们用很短的时间启动我们第一个Spring Boot应用,并且制作一个文件上传系统, 用户可以将本地文件上传到服务器上.我将假设读者为几乎零基础, ...

  4. Spring MVC的文件上传和下载以及拦截器

    一.文件上传 在使用form表单进行文件上传时,必须将method设置为 post,并将enctype设置为multipart/form-data.只有这样设置,浏览器才会将需要上传的文件已二进制数据 ...

  5. 【Spring】SpringMVC文件上传与下载

    对于上传功能,我们在项目中是经常会用到的,比如用户注册的时候,上传用户头像,这个时候就会使用到上传的功能.而对于下载,使用场景也很常见,比如我们项目中有个使用说明是是pdf版的,会提供给用户进行下载的 ...

  6. VUE+Spring Boot,文件上传el-upload报错--Current request is not a multipart request,记录

    做了个简单的文件上传功能,测试时发现报错Current request is not a multipart request,网上查了很多办法,记录一下: 1.最多的:当前请求不是multipart ...

  7. SpringBoot 文件上传、下载、设置大小

    本文使用SpringBoot的版本为2.0.3.RELEASE 1.上传单个文件 ①html对应的提交表单 <form action="uploadFile" method= ...

  8. 全栈开发实战|Spring Boot文件上传与下载

    文件上传与下载是Web应用开发中常用的功能之一.接下来我们将讨论如何在Spring Boot的Web应用开发中,如何实现文件的上传与下载. 01.Spring Boot文件上传与下载 在实际的Web应 ...

  9. SpringBoot下文件上传与下载的实现

    原文:http://blog.csdn.net/colton_null/article/details/76696674 SpringBoot后台如何实现文件上传下载? 最近做的一个项目涉及到文件上传 ...

  10. 超详细的文件上传和下载(Spring Boot)

    超详细的文件上传和下载 前言Ⅰ:@RequestParam和@RequestPart的区别 @RequestPart @RequestPart这个注解用在multipart/form-data表单提交 ...

最新文章

  1. 【Qt】解决在linux上使用Qt的媒体模块(Qt += multimedia)缺少模块multimedia的问题
  2. 为什么总线要用一根来表示一bit
  3. kax格式怎么导入不了pr_pr如何导入.mogrt文件 pr模板导入教程
  4. vue复选框组件自定义对勾_vue2.0中ckeckbox(复选框)的使用心得,及对click事件和change的理解...
  5. SQL Server 计算汉字笔画函数
  6. python气象包_Python-Cartopy包: 地图投影
  7. 成形滤波器和匹配滤波器
  8. AI——六(图层、蒙版)
  9. Vmware中Linux 虚拟终端之间 无法切换 解决方法
  10. 【你好,windows】Windows 10 20H2 19042.630专业工作站纯净版2020.12.1
  11. 2021-04-23
  12. 复测前端BUG一定要清缓存吗?
  13. java课程设计-音乐播放器,基于java的音乐播放器设计.doc
  14. Glade+GTK+ 实现通讯录信息管理系统图形界面软件开发
  15. SQL渗透与防御——(三)SQL盲注
  16. Nodejs使用实例——网站登录验证
  17. C++实现的Socket接口实现自定义协议通信
  18. ACDC隔离电源设计手机适配器智能家居供电5V1A设计方案
  19. 计算2000年1月1日到2008年1月1日相距多少天。(注意闰年) 思路:循环指定的次数(根据年数确定), 计算每年的天数进行累加求和就OK了 (闰年366天,平年365天)<闰年的判断条件:能被4
  20. 快手宣布将实行大小周,打工人何时能正常上下班?

热门文章

  1. 14. CSS 列表
  2. java访问rabbitMQ 一
  3. oracle exp-00011的解决办法
  4. java崩溃停在崩溃代码上_通过编写Java代码让Jvm崩溃
  5. href=“javascript:void(0);”和href=void(change_code(this));
  6. 2017.10.16 模拟赛
  7. 20155313 2016-2017-2 《Java程序设计》第十周学习总结
  8. cassandra 3.x官方文档(5)---探测器
  9. 用ASP.NET开发胖客户端应用程序
  10. HRBEU 字符串 1003