各位版上的大神好
目前客戶的需求是:
無論檔案被改成什麼副檔名,都有辦法判斷出來是何種檔案類型...(比如docx、pptx...主要是offic),並讀檔成功
例如:個別把docx、doc、pptx、zip的副檔名都改成.abc,經過程式處理後,都可以正常讀出檔案內容(zip則是解壓縮成功)
目前我能夠做到的方式是
先找出檔案的檔頭
再判斷檔頭與副檔名類型是否相符
如果不相符則回報檔案格式錯誤
但是因為每種檔頭都不只一個類型的檔案會使用
所以沒有辦法精準判斷檔案類型,再用相對應的方式讀檔
比如:
doc、ppt、xls的檔頭皆為D0CF11E0
docx、odt、pptx、odp、xlsx、ods、zip檔頭可能是504B0304
、504B0506
或504B0708
請問有沒有大神有其他方式可以協助判斷的
感謝
註:客戶是說我們競爭對手可以做到啦,我不知道真的假的
我用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
這篇提到 5 種方法
你可以挑一個符合你要求的
檔案識別
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的檔案格式