背景描述 :
當(dāng)我們要判斷文件的真實類型時,可以使用hutool提供的工具類FileTypeUtil.getType(InputStream in)是一個不錯的方法竟块,可以直接獲取絕大多數(shù)主流文件類型:
我們看其中原理壶运,它讀取了流的頭部編碼,根據(jù)編碼轉(zhuǎn)為對應(yīng)文件類型
如圖
問題
當(dāng)我們判斷好這個文件類型之后浪秘,往往需要繼續(xù)拿流進行處理蒋情,比如使用文件存儲服務(wù)上傳這個文件。如
同個inputStream
先用于判斷是什么類型耸携,然后推到oss服務(wù)棵癣。
這個時候問題出現(xiàn)了,inputStream經(jīng)過
FileTypeUtil.getType(inputStream) 之后夺衍,發(fā)送了變化狈谊,直接推到oss上就無法顯示了。
如果你觀察inputStream經(jīng)過FileTypeUtil.getType(inputStream) 前后沟沙,確實已經(jīng)發(fā)生變化河劝。
打開調(diào)式模式,連續(xù)調(diào)用FileTypeUtil.getType(inputStream)兩次尝胆,第二次是無法再獲取inputStream的文件類型的丧裁,返回的是null。
處理:
找到問題含衔,處理思路也很簡單了煎娇。
FileTypeUtil.getType(inputStream)經(jīng)過之后輸入流會變化二庵,那么要么復(fù)制一份輸入流,
要么就只能通過其他方式去獲取缓呛,保證最終推流時不影響inputStream催享。
補充一點,獲取遠(yuǎn)程文件的inputStream哟绊,可以直接用
InputStream inputStream = new URL(url).openStream(); 即可