文件的上传下载

267 阅读4分钟

文件的上传下载

文件上传与下载

配置

------------------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()