Upupor开发者来说说网站文件的处理方式,偏技术
标签:  后端
70 ·
0 ·
2020-11-21 02:36
最新一次编辑的原因:

同步电台: 《Upupor网站开发者分享如何处理文件上传这件事》

Hello,大家好,最近网站上线了电台,可以支持上传音频文件,但是随之而来的问题也暴露出来。因为Upupor初期比较粗犷,一切以业务功能为主,很多细节被忽略。最近呢,我一直在填以前的坑。今天填的坑就是关于文件类型的坑。

 

目前Upupor网站支持文件上传的业务有4个地方:

  1. 上传头像
  2. 文章编辑器中支持图片的上传
  3. 网站广告申请通过后,提供广告材料上传
  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


本作品系原创,采用《署名-非商业性使用-禁止演绎4.0 国际》许可协议.转载请说明出处
本文链接:https://www.upupor.com/u/20112014341310084096 复制分享

无评论内容,快来评论吧