背景描述 :
当我们要判断文件的真实类型时,可以使用hutool提供的工具类FileTypeUtil.getType(InputStream in)是一个不错的方法,可以直接获取绝大多数主流文件类型:
我们看其中原理,它读取了流的头部编码,根据编码转为对应文件类型
如图
image.png
问题
当我们判断好这个文件类型之后,往往需要继续拿流进行处理,比如使用文件存储服务上传这个文件。如
image.png
同个inputStream
先用于判断是什么类型,然后推到oss服务。
这个时候问题出现了,inputStream经过
FileTypeUtil.getType(inputStream) 之后,发送了变化,直接推到oss上就无法显示了。
image.png
如果你观察inputStream经过FileTypeUtil.getType(inputStream) 前后,确实已经发生变化。
打开调式模式,连续调用FileTypeUtil.getType(inputStream)两次,第二次是无法再获取inputStream的文件类型的,返回的是null。
处理:
找到问题,处理思路也很简单了。
FileTypeUtil.getType(inputStream)经过之后输入流会变化,那么要么复制一份输入流,
要么就只能通过其他方式去获取,保证最终推流时不影响inputStream。
补充一点,获取远程文件的inputStream,可以直接用
InputStream inputStream = new URL(url).openStream(); 即可