iT邦幫忙

2022 iThome 鐵人賽

DAY 25
0
Modern Web

Google商家大解密就靠網頁設計來加成系列 第 25

[DAY25] 圖片類型判別(tika + ImageIo)

  • 分享至 

  • xImage
  •  

Apache Tika

Tika簡介

Apache Tika 是一個內容分析工具,支援多種檔案格式辨別,並且可以提取檔案內部的相關內容,所以在搜尋引擎、翻譯、內容分析等許多方面被廣泛的使用。除了與Java整合之外,也另外提供CLI的介面供使用者使用。

Tika的特點

  1. 多元的元數據:Tika可以透過元數據模型來理解檔案
  2. MIME類型檢測:Tika可以透過MIME標準的媒體類型來提取內容
  3. 語言檢測:Tika透過n-gram算法來進行語言辨識
  4. 內容提取:Tika透過解析器庫,分析各類文件的格式,再依照檔案類型,使用對應的分析器,並提取文件內容

Tika辨別檔案類型

  1. 在Maven增加Tika
<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-core</artifactId>
    <version>${tika-core.version}</version>
</dependency>
  1. 從spring mvc接受MultipartFile,建立TikaInputStream,從tikaConfig取得detector進行辨別
public MediaType getTikaMediaType(MultipartFile multipartFile) {
    byte[] bytes = multipartFile.getBytes();
    TikaConfig tikaConfig = new TikaConfig();
    ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
    TikaInputStream tikaInputStream = TikaInputStream.get(byteArrayInputStream);
    return tikaConfig.getDetector().detect(tikaInputStream, new Metadata());
}

ImageIo

BufferedImage是什麼?

BufferedImage是imageio處理圖片的物件,裡面會有兩個組成ColorModel、Raster,ColorModel定義了這張圖片的色彩能力、檔案類型等,而Raster中有兩個主要元件SampleModel、Databuffer,SampleModel決定了如何存取某個位置的顏色方法,而Databuffer就是儲存原本圖片的Raw Data

判別是否為圖片

從spring mvc接收MultipartFile,建立ImageInputStream,取得ImageReader來判別是否能生成物件(是否是圖片)

public boolean isImage(MultipartFile multipartFile) {
	boolean isImage = false;
	byte[] bytes = multipartFile.getBytes();
	ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
	ImageInputStream imageInputStream = ImageIO.createImageInputStream(byteArrayInputStream);
	Iterator<ImageReader> iter = ImageIO.getImageReaders(imageInputStream);
	if (iter.hasNext()) {
		isImage = true;
	}
    return isImage;
}

結語

不論是透過Tika或是Java的imageio,都可以辨別是否檔案為圖片,但如果需要圖片的更多細節,可以從Tika的Metadata取得,使用上比起imageio來的順手,也能在用戶上傳檔案前多一層辨別和阻擋


上一篇
[Day24] 經濟部商業司Open API應用
下一篇
[DAY26]白箱與黑箱測試
系列文
Google商家大解密就靠網頁設計來加成30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言