最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 讀取圖片的mimeType的方法

 更新時間:2018年01月23日 13:53:37   作者:IamOkay  
本篇文章主要介紹了Java 讀取圖片的mimeType的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、問題描述

在項目開發(fā)的時候,我們經(jīng)常會遇到一類文件上傳的問題,就是獲取圖片是哪種格式。很多情況下,很多人都是用后綴名去判斷,如下所示。

if(filename.endsWith(".png") || filename.endsWith(".jpg"))
{
  //保存圖片
}else{
  throw new IOException("Error file format !");
}

但是這種方式相當(dāng)不可靠,我們可以嘗試將zip文件、rmvb文件、css、js修改后綴名位jpg或者png上傳,也可以上傳到服務(wù)器,這就造成我們服務(wù)器上出現(xiàn)了臟數(shù)據(jù)。此外,對于有些圖片文件,修改成錯誤的擴(kuò)展名,有些瀏覽器可能無法顯示出此圖片。

二、解決方案

在計算機(jī)系統(tǒng)中,媒體類型的文件都有【標(biāo)識符】,zip、圖片本身屬于媒體文件,因此我們可以通過編解碼的方式判斷圖片是否合法。

1、判斷標(biāo)示方法

private static boolean isBMP(byte[] buf){
 byte[] markBuf = "BM".getBytes(); //BMP圖片文件的前兩個字節(jié)
 return compare(buf, markBuf);
 }
 
 private static boolean isICON(byte[] buf) {
 byte[] markBuf = {0, 0, 1, 0, 1, 0, 32, 32};
 return compare(buf, markBuf);
 }
 private static boolean isWEBP(byte[] buf) {
 byte[] markBuf = "RIFF".getBytes(); //WebP圖片識別符
 return compare(buf, markBuf);
 }

 private static boolean isGIF(byte[] buf) { 
 byte[] markBuf = "GIF89a".getBytes(); //GIF識別符
 if(compare(buf, markBuf))
 {
  return true;
 }
 markBuf = "GIF87a".getBytes(); //GIF識別符
 if(compare(buf, markBuf))
 {
  return true;
 }
 return false;
 }
 private static boolean isPNG(byte[] buf) { 
 byte[] markBuf = {(byte) 0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A}; //PNG識別符
  // new String(buf).indexOf("PNG")>0 //也可以使用這種方式
 return compare(buf, markBuf);
 }

 private static boolean isJPEGHeader(byte[] buf) {
 byte[] markBuf = {(byte) 0xff, (byte) 0xd8}; //JPEG開始符 
 return compare(buf, markBuf);
 }
 
 private static boolean isJPEGFooter(byte[] buf)//JPEG結(jié)束符
 {
 byte[] markBuf = {(byte) 0xff, (byte) 0xd9}; 
 return compare(buf, markBuf);
 }

2、核心方法

/**
 * 獲取文件的mimeType
 * @param filename
 * @return
 */
 private static String getMimeType(String filename){
 try {
  String mimeType = readType(filename);
  return String.format("image/%s", mimeType);
 } catch (IOException e) {
  e.printStackTrace();
 }
 return null;
 }

 /**
 * 讀取文件類型
 * @param filename
 * @return
 * @throws IOException
 */
 private static String readType(String filename) throws IOException {
 
 FileInputStream fis = null;
 try {
  File f = new File(filename);
  if(!f.exists() || f.isDirectory() || f.length()<8) {
  throw new IOException("the file ["+f.getAbsolutePath()+"] is not image !");
  }
  
  fis= new FileInputStream(f);
  byte[] bufHeaders = readInputStreamAt(fis,0,8);
  if(isJPEGHeader(bufHeaders))
  { 
  long skiplength = f.length()-2-8; //第一次讀取時已經(jīng)讀了8個byte,因此需要減掉
  byte[] bufFooters = readInputStreamAt(fis, skiplength, 2);
  if(isJPEGFooter(bufFooters))
  {
   return "jpeg";
  }
  }
  if(isPNG(bufHeaders))
  {
  return "png";
  }
  if(isGIF(bufHeaders)){
  
  return "gif";
  }
  if(isWEBP(bufHeaders))
  {
  return "webp";
  }
  if(isBMP(bufHeaders))
  {
  return "bmp";
  }
  if(isICON(bufHeaders))
  {
  return "ico";
  }
  throw new IOException("the image's format is unkown!");
  
 } catch (FileNotFoundException e) {
  throw e;
 }finally{
  try {
  if(fis!=null) fis.close();
  } catch (Exception e) {
  }
 }
 
 }
 
 /**
 * 標(biāo)示一致性比較
 * @param buf 待檢測標(biāo)示
 * @param markBuf 標(biāo)識符字節(jié)數(shù)組
 * @return 返回false標(biāo)示標(biāo)示不匹配
 */
 private static boolean compare(byte[] buf, byte[] markBuf) {
 for (int i = 0; i < markBuf.length; i++) {
  byte b = markBuf[i];
  byte a = buf[i];
  
  if(a!=b){
  return false;
  }
 }
 return true;
 }
 /**
 * 
 * @param fis 輸入流對象
 * @param skiplength 跳過位置長度
 * @param length 要讀取的長度
 * @return 字節(jié)數(shù)組
 * @throws IOException
 */
 private static byte[] readInputStreamAt(FileInputStream fis, long skiplength, int length) throws IOException
 {
 byte[] buf = new byte[length];
 fis.skip(skiplength); //
 int read = fis.read(buf,0,length);
 return buf;
 }

3、測試代碼

正常測試

public class ImageType {
 public static void main(String[] args) { 
  String filename = "oschina.jpg";
  String type = getMimeType(filename);
  System.out.println(type);
 }
}

輸出

image/jpeg

修改擴(kuò)展名測試

①修改oschina.jpeg為oschina.png

②復(fù)制oschina.png刪除擴(kuò)展名

public class ImageType {
 public static void main(String[] args) {
 
  String filename = "oschina.png";
  String type = getMimeType(filename);
  System.out.println(type);
 
  filename = "oschina";
  type = getMimeType(filename);
  System.out.println(type);
      
 }
}

輸出

image/jpeg
image/jpeg

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Log4j日志記錄框架配置及用法解析

    Log4j日志記錄框架配置及用法解析

    這篇文章主要介紹了Log4j日志記錄框架配置及用法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • Java中JDBC事務(wù)與JTA分布式事務(wù)總結(jié)與區(qū)別

    Java中JDBC事務(wù)與JTA分布式事務(wù)總結(jié)與區(qū)別

    Java事務(wù)的類型有三種:JDBC事務(wù)、JTA(Java Transaction API)事務(wù)、容器事務(wù),本文詳細(xì)介紹了JDBC事務(wù)與JTA分布式事務(wù),有需要的可以了解一下。
    2016-11-11
  • java使用itext如何直接生成pdf

    java使用itext如何直接生成pdf

    在工作中,制作PDF文件是常見需求,尤其是需要插入動態(tài)數(shù)據(jù)或圖像時,使用PDF模板填充表單域通常足夠,但對于復(fù)雜文件,可以通過拼接PDF內(nèi)容來靈活排版,iText庫提供了豐富的PDF操作功能,如設(shè)置頁面大小、邊距、字體、生成動態(tài)表格、添加水印、設(shè)置密碼等
    2024-09-09
  • idea?maven?經(jīng)常主目錄自動變回默認(rèn)的解決方法

    idea?maven?經(jīng)常主目錄自動變回默認(rèn)的解決方法

    很多朋友反映idea?maven?經(jīng)常主目錄自動變回默認(rèn),遇到這樣的問題真的很頭疼,該如何解決呢?下面小編給大家介紹下idea?maven目錄變回默認(rèn)的解決方法,需要的朋友可以參考下
    2022-08-08
  • SpringBoot創(chuàng)建動態(tài)定時任務(wù)的幾種方式小結(jié)

    SpringBoot創(chuàng)建動態(tài)定時任務(wù)的幾種方式小結(jié)

    SpringBoot提供了多種實現(xiàn)定時任務(wù)的方式,包括使用@Scheduled注解、SchedulingConfigurer接口、TaskScheduler接口和Quartz框架,@Scheduled適合簡單的定時任務(wù),文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2024-10-10
  • 基于Java編寫一個粽子大作戰(zhàn)小游戲

    基于Java編寫一個粽子大作戰(zhàn)小游戲

    端午節(jié),又稱龍舟節(jié)、重午節(jié),是中國的傳統(tǒng)節(jié)日之一,每年農(nóng)歷五月初五慶祝,雖然端午假期已經(jīng)過去了,小編還是用Java編寫了一個粽子大作戰(zhàn)小游戲,感興趣的可以了解一下
    2023-06-06
  • springboot實戰(zhàn)權(quán)限管理功能圖文步驟附含源碼

    springboot實戰(zhàn)權(quán)限管理功能圖文步驟附含源碼

    這篇文章主要為大家介紹了springboot實戰(zhàn)權(quán)限管理功能圖文步驟及示例源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • SpringBoot項目整合達(dá)夢數(shù)據(jù)庫詳解(MYSQL轉(zhuǎn)換達(dá)夢數(shù)據(jù)庫)

    SpringBoot項目整合達(dá)夢數(shù)據(jù)庫詳解(MYSQL轉(zhuǎn)換達(dá)夢數(shù)據(jù)庫)

    這篇文章主要為大家詳細(xì)介紹了MYSQL轉(zhuǎn)換達(dá)夢數(shù)據(jù)庫以及SpringBoot項目整合達(dá)夢數(shù)據(jù)庫的相關(guān)教程,文中的示例代碼講解詳細(xì),需要的可以參考下
    2025-03-03
  • Java反射的兩種使用方法(推薦)

    Java反射的兩種使用方法(推薦)

    這篇文章主要介紹了Java反射的兩種使用方法,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-05-05
  • SpringBoot使用@EnableAutoConfiguration實現(xiàn)自動配置詳解

    SpringBoot使用@EnableAutoConfiguration實現(xiàn)自動配置詳解

    你有想過SpringBoot為什么能夠自動的幫我們創(chuàng)建一個Bean對象么?或許在我們使用的時候只需要在自己自定義的配置文件中加入@Bean對象就可以,但SpringBoot是如何來創(chuàng)建的呢
    2022-08-08

最新評論

衡阳县| 繁昌县| 新巴尔虎左旗| 柳江县| 开原市| 昆山市| 绍兴市| 苏尼特右旗| 沭阳县| 孝义市| 大港区| 开原市| 科尔| 共和县| 稷山县| 莎车县| 施秉县| 武威市| 皮山县| 台北市| 平利县| 随州市| 郯城县| 明溪县| 三原县| 肥东县| 治多县| 德安县| 玉树县| 万载县| 山阳县| 虎林市| 乌审旗| 义马市| 榆树市| 宜宾县| 盐山县| 霞浦县| 洪雅县| 荃湾区| 泊头市|