iT邦幫忙

1

JAVA判斷檔案類型

各位版上的大神好

目前客戶的需求是:

無論檔案被改成什麼副檔名,都有辦法判斷出來是何種檔案類型...(比如docx、pptx...主要是offic),並讀檔成功
例如:個別把docx、doc、pptx、zip的副檔名都改成.abc,經過程式處理後,都可以正常讀出檔案內容(zip則是解壓縮成功)

目前我能夠做到的方式是
先找出檔案的檔頭
再判斷檔頭與副檔名類型是否相符
如果不相符則回報檔案格式錯誤

但是因為每種檔頭都不只一個類型的檔案會使用
所以沒有辦法精準判斷檔案類型,再用相對應的方式讀檔
比如:
doc、ppt、xls的檔頭皆為D0CF11E0
docx、odt、pptx、odp、xlsx、ods、zip檔頭可能是504B0304504B0506504B0708

請問有沒有大神有其他方式可以協助判斷的
感謝


註:客戶是說我們競爭對手可以做到啦,我不知道真的假的

試看看tika能不能滿足你要的 ? 不過.. xlsx這類的其實都算zip ...
DennisLu iT邦研究生 1 級 ‧ 2021-09-30 16:36:24 檢舉
關鍵字 : File Signatures
Hankz iT邦新手 2 級 ‧ 2021-09-30 18:01:40 檢舉
tika沒有用過 但是似乎也是用mime去判斷...而一堆檔案類型都算`application/zip`
File Signatures看起來跟檔頭好像沒什麼不同
還是無法分辨docx、pptx、xlsx

我再找找看其他方案
謝謝你們
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
喵凹咿唉思嗯
iT邦研究生 5 級 ‧ 2021-10-01 13:51:19
最佳解答

我用Tika看起來沒啥問題呀? 會提zip的問題只是覺得zip本身應該也是個正確的選項吧..

請參考官方Container Aware Detection的說明

簡易code, Tika 有沒載對正確的套件會影響產出, 更詳細的操作跟說明請參考官網..

 @Test
    public void testFile(){
        File file1 = new File("C:\\test\\sample.no");

        System.out.println(new DefaultDetector().detect(TikaInputStream.get(file1.toPath()), new Metadata()));

    }

maven

<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-app</artifactId>
    <version>2.1.0</version>
</dependency>

result:

application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

Hankz iT邦新手 2 級 ‧ 2021-10-01 15:06:06 檢舉

我周末研究一下 感謝

Hankz iT邦新手 2 級 ‧ 2021-10-04 14:42:39 檢舉

稍微玩了一下 應該可行
雖然應該判斷錯誤的狀況不會太多
但是如果判斷還是有問題
頂多就丟個讀檔失敗就好
感謝

有幫助就好:) 會誤判的話可以考慮調整Detector或是限定類型, 精度會再高一些

0
海綿寶寶
iT邦大神 1 級 ‧ 2021-09-30 17:31:57

這篇提到 5 種方法
你可以挑一個符合你要求的

Hankz iT邦新手 2 級 ‧ 2021-09-30 17:56:00 檢舉

mime很好用...我寫php也都是用這個來判斷
但是跟檔頭有相同問題
docx、xlsx、zip等等
mime都有可能是application/zip
不然我原本也要拿mime來做判斷
感謝

1
player
iT邦大師 1 級 ‧ 2021-10-01 18:58:21

檔案識別

1.副檔名
缺點是附檔名如果錯了,會分辨不出來

2.MIME Type
後來又被稱為Internet media type
問題是這個通常是得透過http傳輸才能取得
而且這也是不保證正確的
https://en.wikipedia.org/wiki/Media_type

3.File Signatures (俗稱檔頭識別)
https://en.wikipedia.org/wiki/List_of_file_signatures

4.判斷是XML還是ZIP的再去細分
因為有很多的檔案格式都是基於 XML或ZIP當基礎的
像是MS的OpenXML的Office的檔案格式
都是基於ZIP基礎的XML的檔案(所以需要解開後再去判斷)
SVG則基於XML的檔案格式

Hankz iT邦新手 2 級 ‧ 2021-10-04 14:43:04 檢舉

感謝整理

我要發表回答

立即登入回答