文件上传需要使用到 MultipartResolver接口。

Spring MVC 使用 MultipartResolver接口的实现类:CommonsMultipartResolver 。CommonsMultipartResolver类是基于Apache Commons FileUpload技术实现的。 所以,SpringMVC的文件上传需要依赖Apache Commons FileUpload的组件。传送门:SpringMVC实现文件上传和下载

SpringBoot 默认使用 MultipartResolver接口的实现类:StandardServletMultipartResolver。默认配置了单文件大小限制等。所以,不需要依赖Apache Commons FileUpload的组件,即可直接使用。

    @Beanpublic MultipartResolver multipartResolver() {// 默认配不配都行,如果使用CommonsMultipartResolver,注入就行
//        StandardServletMultipartResolver resolver = new StandardServletMultipartResolver(); CommonsMultipartResolver resolver = new CommonsMultipartResolver();return resolver;}

新建一个SpringBoot项目,引入web依赖。使用默认的resolver。

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

一、文件上传

1、单文件上传

MultipartFile 类封装了请求数据中的文件,此时这个文件存储在内存中或临时的磁盘文件中,需要将其转存到一个合适的位置,因为请求结束后临时存储将被清空。在 MultipartFile 接口中有如下方法:

  • String getName();                   // 获取参数的名称
  • String getOriginalFilename(); // 获取文件的原名称
  • String getContentType();        // 文件内容的类型
  • boolean isEmpty();                 // 文件是否为空
  • long getSize();                        // 文件大小
  • byte[] getBytes();                    // 将文件内容以字节数组的形式返回
  • InputStream getInputStream(); // 将文件内容以输入流的形式返回
  • void transferTo(File dest);      // 将文件内容传输到指定文件中
@Controller
@RequestMapping("/file")
public class FileController {@PostMapping("/upload")@ResponseBodypublic String upload(MultipartFile file) {if(file.isEmpty()){return "文件不能为可空!";}// 使用日期来分类管理上传的文件String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());File folder = new File("D:/E/upload/" + format);if (!folder.exists()) {folder.mkdirs();}String oldName = file.getOriginalFilename();String newName = UUID.randomUUID().toString() + oldName.substring(oldName.lastIndexOf("."));File newFile = new File(folder, newName);try {//保存文件,返回文件路径file.transferTo(newFile);return folder + newName;} catch (IOException ioException) {ioException.printStackTrace();}return "error";}}

2、多文件上传

1)可以和单文件上传一样,多定义几个MultipartFile对象:

    @PostMapping("/uploads2")@ResponseBodypublic String uploads2(MultipartFile file1, MultipartFile file2) {// 使用日期来分类管理上传的文件String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());File folder = new File("D:/E/upload/" + format);if (!folder.exists()) {folder.mkdirs();}try {String oldName = file1.getOriginalFilename();String newName = UUID.randomUUID().toString() + oldName.substring(oldName.lastIndexOf("."));File newFile = new File(folder, newName);//保存文件file1.transferTo(newFile);oldName = file2.getOriginalFilename();newName = UUID.randomUUID().toString() + oldName.substring(oldName.lastIndexOf("."));newFile = new File(folder, newName);//保存文件file2.transferTo(newFile);return "success";} catch (IOException ioException) {ioException.printStackTrace();}return "error";}

2)可以使用 MultipartFile[] 数组来接受:

    @PostMapping("/uploads")@ResponseBodypublic String uploads(MultipartFile[] files) {// 使用日期来分类管理上传的文件String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());File folder = new File("D:/E/upload/" + format);if (!folder.exists()) {folder.mkdirs();}try {for (MultipartFile file : files) {if(file.isEmpty()){System.out.println("文件不能为可空!");continue;}String oldName = file.getOriginalFilename();String newName = UUID.randomUUID().toString() + oldName.substring(oldName.lastIndexOf("."));File newFile = new File(folder, newName);//保存文件file.transferTo(newFile);}return "success";} catch (IOException ioException) {ioException.printStackTrace();}return "error";}

我使用 postman测试了一下均成功。这里简单写一下前端的代码。

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>文件上传和下载</title>
</head>
<body><form action='http://localhost:8080/file/upload' method='post' enctype='multipart/form-data'><input type='file' name='file'><button type='submit'>上传</button></form><a href="template/asd.jpg" download="aaname.jpg">下载</a>
</body>
</html>

3、修改 SpringBoot对文件限制的默认配置项

在 MultipartAutoConfiguration类中会看到创建的默认值,我们要自定义,添加bean配置,替换它的即可。

方式一:在 application.yaml 配置文件中自定义:

spring:servlet:multipart:enabled: true  #是否启用http上传处理max-request-size: 100MB #最大请求文件的大小max-file-size: 900KB      #设置单个文件的大小file-size-threshold: 15MB  #当文件达到多少时进行磁盘写入(临时文件的存放目录)location: D:/E/upload/temp #当磁盘写入时的临时文件的存放目录(目录不存在会自动创建,上传完毕会自动删除临时文件)
#      resolve-lazily: false   #当前文件和参数被访问时是否再解析成文件

方式二:在 配置类中自定义:

在@Configuration注解的配置类中,增加Bean配置。通过 MultipartConfigFactory类中的得到 MultipartConfigElement。

@Configuration
public class UploadConfig {@BeanMultipartConfigElement multipartConfigElement(){MultipartConfigFactory factory = new MultipartConfigFactory();factory.setLocation("D:/E/upload/temp");factory.setFileSizeThreshold(DataSize.parse("15", DataUnit.MEGABYTES)); //15MBfactory.setMaxRequestSize(DataSize.parse("100", DataUnit.MEGABYTES)); //100MBfactory.setMaxFileSize(DataSize.parse("90", DataUnit.KILOBYTES)); //900KBMultipartConfigElement element = factory.createMultipartConfig();return element;}}

如果想使用 CommonsMultipartResolver ,添加bean配置即可:

    @Beanpublic MultipartResolver multipartResolver() {// 默认配不配都行,如果使用CommonsMultipartResolver,注入就行
//        StandardServletMultipartResolver resolver = new StandardServletMultipartResolver();CommonsMultipartResolver resolver = new CommonsMultipartResolver();resolver.setDefaultEncoding("UTF-8");resolver.setMaxInMemorySize(900 * 1024); // 900KBresolver.setMaxUploadSize(100 * 1024 * 1024);// 上传文件大小 100Mreturn resolver;}

二、文件下载

1、固定模板文件下载

不需要后台处理,使用html的<a> 标签即可实现。

<a href="template/asd.jpg" download="aaname.jpg">下载</a>

2、后台处理文件下载

对文件的处理更加灵活,最后把文件二进制数据写到响应中即可。

注意:不同浏览器文件名乱码的问题。

这里使用了 org.apache.commons.io.FileUtils工具类来处理文件流的操作,所以添加它的依赖。你也可以自己写。

        <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.3</version></dependency>
    @GetMapping("/download")@ResponseBodypublic ResponseEntity<byte[]> download() throws Exception{//下载文件,简单new个文件String downloadFilePath = "D:/E/upload/2020-10-20/8d053ae3-5fcb-4a7a-ab68-6e69e706f84c.jpg";File downloadFile = new File(downloadFilePath);String downloadFilenName ="下载文件名123" + downloadFile.getName().substring(downloadFile.getName().lastIndexOf("."));HttpHeaders headers = new HttpHeaders();//下载显示的文件名,并解决中文名称乱码问题String downloadFileName = new String(downloadFilenName.getBytes("UTF-8"),"iso-8859-1");//通知浏览器以attachment(下载方式)打开headers.setContentDispositionFormData("attachment", downloadFileName);//applicatin/octet-stream: 二进制流数据(最常见的文件下载)headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);// 使用下org.apache.commons.io.FileUtils工具类byte[] bytes = FileUtils.readFileToByteArray(downloadFile);return new ResponseEntity<byte[]>(bytes, headers, HttpStatus.CREATED);}

这里文件操作都在本地,项目中可能会使用文件服务器,比如:FTP服务器,阿里OSS云存储等。操作大同小异。

—— Stay Hungry. Stay Foolish. 求知若饥,虚心若愚。

SpringBoot实现文件上传和下载相关推荐

  1. 微信小程序+SpringBoot实现文件上传与下载

    微信小程序+SpringBoot实现文件上传与下载 1.文件上传 1.1 后端部分 1.1.1 引入Apache Commons FIleUpload组件依赖 1.1.2 设置上传文件大小限制 1.1 ...

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

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

  3. 一篇文章教你学会使用SpringBoot实现文件上传和下载

    文章目录 一.搭建SpringBoot开发环境 1.创建项目 2.配置application.properties参数 3.实体响应类和异常信息类 4.创建FileController 二.接口测试 ...

  4. springboot+web文件上传和下载

    一.首先安装mysql数据库,开启web服务器. 二.pom.xml文件依赖包配置如下: <?xml version="1.0" encoding="UTF-8&q ...

  5. asp.net coree文件上传与下载实例

    asp.net core像springboot非常相似,我们从一个springboot文件上传与下载的例子来引到asp.net core的文件上传与下载: 本文asp.net core版本为:6.0 ...

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

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

  7. SpringBoot图文教程4—SpringBoot 实现文件上传下载(亲测)

    SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+案例 思维导图」「基础篇上」 SpringBoot图文教程2-日志的使用「logback」「log4j」 Spring ...

  8. springboot改文件头_SpringBoot图文教程4—SpringBoot 实现文件上传下载

    有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 文章结尾配套自测面试题,学完技术自我测试更扎实 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例 ...

  9. SpringBoot整合阿里云OSS文件上传、下载、查看、删除

    SpringBoot整合阿里云OSS文件上传.下载.查看.删除 该项目源码地址:https://github.com/ggb2312/springboot-integration-examples ( ...

最新文章

  1. 创建Swap交换空间
  2. PinkLotar 外挂汉化版+Mod 工具
  3. Django 2.1.3 中间件使用
  4. 深度学习损失函数大全
  5. Android性能优化之启动优化实战篇,积累总结
  6. FreeModbus RTU传输
  7. IntelliJ IDEA开发入门教程
  8. 1.1浅谈Spring(一个叫春的框架)
  9. solr mysql安装教程_Solr安装使用教程
  10. 理想费米气体的量子统计推导
  11. 概率假设密度滤波 matlab,概率假设密度滤波的物理空间意义
  12. 启发式算法(heuristic)
  13. oracle收集snop,Oracle 9i 使用Statpack snap 步骤和说明
  14. JavaScript 推断浏览器类型及32位64位
  15. 关于operator bool () 和bool operator ==()
  16. python模拟登陆 验证码el_python 模拟登陆163邮箱
  17. tyut数据分析考试资料
  18. fatal: HttpRequestException encountered解决方法
  19. 800万商户都在抖音开通了企业号建立了私域流量新领地,你还在等什么
  20. 新奥股份2019年经营性现金流和主营业务收入稳健增长

热门文章

  1. MATLAB中的一些小技巧 - [MATLAB]
  2. 魔方(7)五魔方、二阶五魔方
  3. 如何以编程方式执行Unwind segue?
  4. 卸载win10自带应用
  5. Linux 的常用系统及网络命令
  6. Python和Matlab生成图片到visio的矢量图
  7. rm 好凶残,太 TM 吓人了!
  8. 在我的世界里玩我的世界是一种怎样的体验?
  9. 全排列问题(AcWing 823. 排列)
  10. ThreeJS 骨架图显示、骨骼修改颜色