同步电台: 《Upupor网站开发者分享如何处理文件上传这件事》
Hello,大家好,最近网站上线了电台,可以支持上传音频文件,但是随之而来的问题也暴露出来。因为Upupor初期比较粗犷,一切以业务功能为主,很多细节被忽略。最近呢,我一直在填以前的坑。今天填的坑就是关于文件类型的坑。
目前Upupor网站支持文件上传的业务有4个地方:
- 上传头像
- 文章编辑器中支持图片的上传
- 网站广告申请通过后,提供广告材料上传
- 电台音频的上传
这4个地方的文件处理在后端实现都是统一的一个逻辑。之前的逻辑只是校验了基础的文件类型且是通过文件的后缀来实现。很显然这种方式非常的不安全,因为可能会有人通过伪造文件上传一些非法的文件到服务器,对服务的稳定性造成影响。这个问题很早就已经意识到,但是一直没有处理。这两天把这个问题处理了。现在和大家聊聊处理的过程。
一开始我是在网上搜索相关的处理方式,但是发现大家通篇的处理方式就是读取文件的文件头来判断,这个需要些很多的逻辑处理。一般这种逻辑很多的代码我是不想写的,因此我想再找找有没有别人封装好的,当然把网上出现的代码进行二次封装这种的我也是直接过滤,因为本质上与我在网上检索的并无二致。于是我尝试使用英文关键字搜索,必开中文。当我把file detect java
这三个关键字输入到google中,在第二页看到了一个Apache的项目Tika

于是我打开Tika的官网,经过大概的浏览,确认Tika就是我想要的。于是我今天就把Tika接入到Upupor网站了,目前Upupor网站的文件检查全部是基于Tika实现的。文末会附上Tika的使用方法,非常简单。
说完了文件类型的检测,再说说文件上传校验是否重复的处理方式。之前Upupor上传的所有文件都没有校验是否是同一个文件,因此存在一个问题,就是同一个文件可以上传多次,这个非常占用空间及上传带宽(占用空间和带宽都是钱啊),那么针对这个问题,也做了一个很小的优化。逻辑非常简单就是校验文件的md5,如果是同一个文件直接复用上次一上传成功的url,这样一来节省了空间和带宽的同时,用户体验的大大的得到了提升,因为用户对于同一文件的重复上传速度会非常快。
那么对于检测文件的MD5值也可以很简单哈,不用像网上那样写一堆代码重复造轮子,可以使用apache的commons顶级项目,使用其中的DigestUtils
工具类即可:
DigestUtils.md5Hex(InputStream inputStream)
Tika使用简介
使用Apache的Tika:
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>1.24.1</version>
</dependency>
使用也非常简单:
Tika tika = new Tika();
// 直接调用detect方法即可完成文件类型检测
String result = tika.detect(file);
Tika提供了非常多的入参类型,可以支持网络文件的检测、输入流的检测、文件的检测等等
Tika有非常丰富的检测入参Apache Tika 官网: https://tika.apache.org/
Apache Tika Github: https://github.com/apache/tika