文件的上传下载
文件上传与下载
配置
------------------application.properties------------------
# 单个文件大小
spring.servlet.multipart.max-file-size: 1024MB
# 总文件大小(允许存储文件的文件夹大小)
spring.servlet.multipart.max-request-size: 10240MB
大文件的上传方案
异步上传
- 当我们上传的文件很大,后台需要处理的时间很长,用户期望切换到其它页面继续工作,而不需要等待完成。这时候我们可以采用异步上传的方式
- 解决方式
- 在SpringBoot中通过@EnableAsync开启异步处理
- 然后在方法上加上和@Async即可
分片上传
分片上传就是将一个大文件分成若干份大小相等的小块文件,等所有小块文件上传成功后,再将文件进行合并成完整的原始文件
实现方式
-
断点续传
- 断点续传就是重新上传文件时,先判断哪些文件块已经上传过了(比如将分片的chuck md5等信息保存在DB中),如果上传过了则跳过这些块,否则上传没有上传的块
-
秒传
- 当用户选择上传一个文件时,服务端检测该文件之前是否已经被上传过,如果服务器已经存有该文件(完全一样),就立马返回前端 “文件已上传成功”。前端随即将进度条更新至100%。 这样给用户的感觉就是 “秒传” 的感觉
分片处理逻辑
- 前端
- 需要将文件file.slice()成多个文件块,并计算每一块的md5值
- 每次请求上传都是传一个小文件块
- 服务端
- 需要接收每次上传的文件块并保存文件块的信息(比如md5), 如果已经上传则跳过;
- 最后等所有文件上传完成之后,将所有的文件块合并成一个大文件
excel导入导出
POI
Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能
支持excel、word等文件的导入导出
依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
</dependency>
XLS与XLSX的区别
EasyExcel
EasyExcel是阿里开源的基于POI封装的Excel处理工具
是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。它能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能
依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
</dependency>
EasyPOI(中大型项目不建议使用)
依赖
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-spring-boot-starter</artifactId>
</dependency>
word导入导出
POI
支持excel、word等文件的导入导出
依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId></dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
</dependency>
POI-tl
poi-tl是一个基于Apache POI的Word模板引擎,也是一个免费开源的Java类库,你可以非常方便的加入到你的项目中,并且拥有着让人喜悦的特性
依赖
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
</dependency>
插件
- highlight
- markdown
TDO模式
-
Template(模板)
- 模板是Docx格式的Word文档,你可以使用Microsoft office、WPS Office、Pages等任何你喜欢的软件制作模板,也可以使用Apache POI代码来生成模板
-
Data(数据)
- 数据类似于哈希或者字典,可以是Map结构
-
Output(输出流)
- 以流的方式进行输出。可以写到任意输出流中,比如文件流、网络流
-
示例:
XWPFTemplate template = XWPFTemplate .compile("template.docx") .render( new HashMap<String, Object>(){{put("title", "模板引擎");}}); template.writeAndClose(new FileOutputStream("output.docx"))
导出PDF
iText
iText是著名的开放源码的站点sourceforge一个项目(由Bruno Lowagie编写),是一个用Java和.NET语言写的库,用来创建和修改PDF文件。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件
在5.x以上版本中使用的是AGPLv3(这个协议意味着,只有个人用途和开源的项目才能使用itext这个库,否则是需要收费的)
GitHub上有团队基于itext 4.x版本(MPL和LGPL双许可协议)fork了一个分支成为OpenPDF,并继续维护该项目
依赖
#2.x
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
</dependency>
#5.x
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
</dependency>
#7.x
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<type>pom</type>
</dependency>
使用示例
#创建文档
Document document = new Document(PageSize.A4)
#绑定输出流(通过pdfwriter)
PdfWriter.getInstance(document, os);
#打开文档
document.open()
#往文档中添加内容
document.add(xxx)
#关闭文档
document.close()