SpringBoot实现文件上传和下载
文件上传需要使用到 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实现文件上传和下载相关推荐
- 微信小程序+SpringBoot实现文件上传与下载
微信小程序+SpringBoot实现文件上传与下载 1.文件上传 1.1 后端部分 1.1.1 引入Apache Commons FIleUpload组件依赖 1.1.2 设置上传文件大小限制 1.1 ...
- SpringBoot下文件上传与下载的实现
原文:http://blog.csdn.net/colton_null/article/details/76696674 SpringBoot后台如何实现文件上传下载? 最近做的一个项目涉及到文件上传 ...
- 一篇文章教你学会使用SpringBoot实现文件上传和下载
文章目录 一.搭建SpringBoot开发环境 1.创建项目 2.配置application.properties参数 3.实体响应类和异常信息类 4.创建FileController 二.接口测试 ...
- springboot+web文件上传和下载
一.首先安装mysql数据库,开启web服务器. 二.pom.xml文件依赖包配置如下: <?xml version="1.0" encoding="UTF-8&q ...
- asp.net coree文件上传与下载实例
asp.net core像springboot非常相似,我们从一个springboot文件上传与下载的例子来引到asp.net core的文件上传与下载: 本文asp.net core版本为:6.0 ...
- SpringBoot 文件上传、下载、设置大小
本文使用SpringBoot的版本为2.0.3.RELEASE 1.上传单个文件 ①html对应的提交表单 <form action="uploadFile" method= ...
- SpringBoot图文教程4—SpringBoot 实现文件上传下载(亲测)
SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+案例 思维导图」「基础篇上」 SpringBoot图文教程2-日志的使用「logback」「log4j」 Spring ...
- springboot改文件头_SpringBoot图文教程4—SpringBoot 实现文件上传下载
有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 文章结尾配套自测面试题,学完技术自我测试更扎实 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例 ...
- SpringBoot整合阿里云OSS文件上传、下载、查看、删除
SpringBoot整合阿里云OSS文件上传.下载.查看.删除 该项目源码地址:https://github.com/ggb2312/springboot-integration-examples ( ...
最新文章
- 创建Swap交换空间
- PinkLotar 外挂汉化版+Mod 工具
- Django 2.1.3 中间件使用
- 深度学习损失函数大全
- Android性能优化之启动优化实战篇,积累总结
- FreeModbus RTU传输
- IntelliJ IDEA开发入门教程
- 1.1浅谈Spring(一个叫春的框架)
- solr mysql安装教程_Solr安装使用教程
- 理想费米气体的量子统计推导
- 概率假设密度滤波 matlab,概率假设密度滤波的物理空间意义
- 启发式算法(heuristic)
- oracle收集snop,Oracle 9i 使用Statpack snap 步骤和说明
- JavaScript 推断浏览器类型及32位64位
- 关于operator bool () 和bool operator ==()
- python模拟登陆 验证码el_python 模拟登陆163邮箱
- tyut数据分析考试资料
- fatal: HttpRequestException encountered解决方法
- 800万商户都在抖音开通了企业号建立了私域流量新领地,你还在等什么
- 新奥股份2019年经营性现金流和主营业务收入稳健增长