Spring Boot 教程 - 文件上传下载
在日常的开发工作中,基本上每个项目都会有各种文件的上传和下载,大多数文件都是excel文件,操作excel的JavaAPI我用的是apache的POI进行操作的,POI我之后会专门讲到。此次我们不讲如何操作文件,只讲如何上传文件和下载文件。
1. 文件的上传
在现在的JavaWeb项目中,与前端进行交互的基本都是SpringMVC框架。Spring专门提供了一个接口MultipartFile
,这个接口帮我们简化了从页面到服务端的文件操作,以前我们只能从request里面拿,现在有了这个接口,我们操作起来就会很简单。话不多说,直接上代码。
我们只是模拟文件上传的操作,所以我们从页面上传文件,然后存到电脑桌面。
@RequestMapping("/upload")
public void upload(MultipartFile file) throws IOException {
init(file, 1);
}
@RequestMapping("/uploads")
public void uploads(MultipartFile[] files, DTO dto) throws IOException {
for (int i = 0; i < files.length; i++) {
init(files[i], i);
}
System.out.println(dto.getParam());
}
/**
* 下载文件初始化
* @param file 文件
* @param i 为了区别文件,防止被覆盖
* @throws IOException
*/
private void init(MultipartFile file, int i) throws IOException {
String filename = file.getOriginalFilename();
OutputStream os = new FileOutputStream(new File("C:\\Users\\WJF\\Desktop" + File.separator + i + filename));
InputStream is = file.getInputStream();
StreamUtils.copy(is, os);
is.close();
os.close();
}
上面的代码中,不管是单个文件还是多文件都是很简单的,还可以带其他参数DTO
。
2. 文件的下载
文件的下载也是很简单的,但是Response头如果没有设置好,就可能下载失败,下载下来也可能是乱码的。但是这些头设置其实很简单,但是每次下载文件的时候都要这么设置一下,其实是很繁琐的,所以在这里我使用了已经封装好的下载API,直接上代码。
首先我们引入jar包:
<!--springboot父工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<!--springboot框架web组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--wjf-download下载小框架,用来简化下载的无味繁琐的操作-->
<dependency>
<groupId>red.wjf</groupId>
<artifactId>wjf-download</artifactId>
<version>0.1.0.RELEASE</version>
</dependency>
</dependencies>
在这里我引入了一个下载的jar包,这个包可以在maven中央仓库直接找到的。这个下载文件jar包的官网地址:传送门
在下载文件之前我们需要配置一下,创建一个下载器,将下载器交给Spring管理:
DownloadConfig.java
:
package com.butterflytri.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import red.wjf.download.downloader.ImageDownloader;
import red.wjf.download.downloader.WebDownloader;
/**
* @author: WJF
* @date: 2020/7/29
* @description: DownloadConfig
*/
@Configuration
public class DownloadConfig {
@Bean
public WebDownloader webDownloader() {
return new WebDownloader();
}
@Bean
public ImageDownloader imageDownloader() {
return new ImageDownloader();
}
}
在这里我们创建了两个下载器,都交给了Spring框架管理。
@RequestMapping("/downloadTest")
public void download01(HttpServletRequest request, HttpServletResponse response, String fileName) {
InputStream is = this.getClass().getClassLoader().getResourceAsStream("test.docx");
try {
DataWriter writer = new DataWriter(is);
webDownloader.defaultDownload(request, response, fileName, writer);
} catch (IOException e) {
e.printStackTrace();
}
}
@RequestMapping("/downloadImg")
public void downloadImg(HttpServletRequest request, HttpServletResponse response) {
InputStream is = this.getClass().getClassLoader().getResourceAsStream("img.jpg");
ImageWriter writer = new ImageWriter(is, ImgSuffix.JPG);
imageDownloader.defaultDownload(request, response, writer);
}
这两个文件(test.docx和img.jpg)都在类路径下,从浏览器页面调用方法,就会下载,不会乱码也不会下载失败,除非文件不存在。jar包还提供了图片的Base64格式下载。在国内我们只需要调用这个默认的下载方法就可以了。下载的演示我就不演示了,大家可以拉下我的代码看看,觉得我写的东西对你有用,也可以给我点个赞哦。
3. 项目地址
本项目传送门:
- GitHub ---> spring-upload-download
- Gitee ---> spring-upload-download
此教程会一直更新下去,觉得博主写的可以的话,关注一下,也可以更方便下次来学习。
- 作者:Butterfly-Tri
- 出处:Butterfly-Tri个人博客
- 版权所有,欢迎保留原文链接进行转载
Spring Boot 教程 - 文件上传下载的更多相关文章
- spring boot实现文件上传下载
spring boot 引入”约定大于配置“的概念,实现自动配置,节约了开发人员的开发成本,并且凭借其微服务架构的方式和较少的配置,一出来就占据大片开发人员的芳心.大部分的配置从开发人员可见变成了相对 ...
- Spring Boot入门——文件上传与下载
1.在pom.xml文件中添加依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...
- spring boot:单文件上传/多文件上传/表单中多个文件域上传(spring boot 2.3.2)
一,表单中有多个文件域时如何实现说明和文件的对应? 1,说明和文件对应 文件上传页面中,如果有多个文件域又有多个相对应的文件说明时, 文件和说明如何对应? 我们在表单中给对应的file变量和text变 ...
- spring mvc注解文件上传下载
需要两个包: 包如何导入就不介绍了,前端代码如下(一定要加enctype="multipart/form-data"让服务器知道是文件上传): <form action=&q ...
- Spring Boot—04文件上传
package com.smartmap.sample.ch1.controller.view; import java.io.File; import java.io.IOException; im ...
- spring mvc 实现文件上传下载
/** * 文件上传 * @param pictureFile */ @RequestMapping("/reportupload") public ResponseInfo up ...
- spring boot Tomcat文件上传找不到零时文件夹
springboot项目上传文件是找不到零时文件夹 1.本身启动jar包时内置Tomcat没有创建零时文件夹 2.在zuul网关级别没有创建零时文件夹 处理方案: -Djava.io.tmpdir=/ ...
- Spring Boot RestTemplate文件上传
@ResponseBody @RequestMapping(value = "/upload.do", method = RequestMethod.POST) public St ...
- Spring boot设置文件上传大小限制
原文:https://blog.csdn.net/lizhangyong1989/article/details/78586421 Spring boot1.0版本的application.prope ...
随机推荐
- Python基础-异常
异常捕获 常见异常类型 Exception:顶级异常类,大部分异常类都是它的子类.SyntaxError:语法错误TypeError:类型错误ValueError:值错误NameError:找不到名称 ...
- [jvm] -- 判断对象是否死亡篇
判断对象是否死亡的两种方法 引用计数法 给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加 1:当引用失效,计数器就减 1:任何时候计数器为 0 的对象就是不可能再被使用的. 优点: 简单 ...
- 题解 UVA501 【Black Box】
思路与中位数一题,解决方案比较像,使用对顶堆来解决. 具体实现为,使用两个堆,大根堆维护较小的值,小根堆维护较大的值,即小根堆的堆顶是较大的数中最小的,大根堆的堆顶是较小的数中最大的. 将大于大根堆堆 ...
- Netty 学习笔记(2) ------ 数据传输载体ByteBuf
Netty中读写以ByteBuf为载体进行交互 ByteBuf的结构 ByteBuf以readerIndex和writerIndex划分为三块区域,废弃字节,可读字节,可写字节.每次从ByteBuf读 ...
- Eclipse普通java Project文件路径问题
Eclipse普通java Project文件路径问题 项目的结构如图 读取src里某个包下的文件,代码如下 BufferedReader br=new BufferedReader(new File ...
- spring学习(四)使用注解代替xml配置
用的是IDEA的maven工程,pom.xml文件导包依赖省略 一.书写要导入容器的实体类 import org.springframework.beans.factory.annotation.Va ...
- SAS X option
1. SAS X选项就是调用DOS命令. 例子: option noxwait;/*黑窗口执行完命令后自动关闭*/ %let path =.; %let filter=*.lst; X “ dir & ...
- 开源项目推荐 - 巨鲸任务调度平台(Spark、Flink)
Big Whale(巨鲸),为美柚大数据研发的大数据任务调度平台,提供Spark.Flink等离线任务的调度(支持任务间的依赖调度)以及实时任务的监控,并具有批次积压告警.任务异常重启.重复应用监测. ...
- pip安装第三方包超时
1. pip安装requests模块超时 [root@2 zabbix_agentd.d]# pip install requests Collecting requests /usr/lib/pyt ...
- rsync 的用法
rsync官方网站: https://www.samba.org/ftp/rsync/rsync.html rsync是可以实现增量备份的工具.配合任务计划,rsync能实现定时或间隔同步,配合ino ...
- spring boot实现文件上传下载