קבלת סוג Mime של קובץ ב- Java

1. סקירה כללית

במדריך זה נבחן אסטרטגיות שונות לקבלת סוגי MIME של קובץ. נבחן דרכים להרחיב את סוגי ה- MIME הזמינים לאסטרטגיות, בכל מקום שרלוונטי.

אנו גם נציין היכן עלינו להעדיף אסטרטגיה אחת על פני השנייה.

2. שימוש ב- Java 7

נתחיל ב- Java 7 - המספק את השיטה Files.probeContentType (נתיב) לפתרון סוג MIME:

@ מבחן ציבורי בטל כאשר משתמשJava7_thenSuccess () {נתיב נתיב = קובץ חדש ("product.png"). ToPath (); מחרוזת mimeType = Files.probeContentType (נתיב); assertEquals (mimeType, "image / png"); } 

שיטה זו עושה שימוש במותקן FileTypeDetector יישומים לבדיקת סוג MIME. זה קורא ל probeContentType של כל יישום כדי לפתור את הסוג.

כעת, אם הקובץ מזוהה על ידי מימוש כלשהו, ​​סוג התוכן מוחזר. עם זאת, אם זה לא קורה, מופעל גלאי סוג קבצים המוגדר כברירת מחדל.

עם זאת, יישומי ברירת המחדל הם ספציפיים למערכת ההפעלה ועשויים להיכשל בהתאם למערכת ההפעלה בה אנו משתמשים.

בנוסף לכך, חשוב גם לציין שהאסטרטגיה תיכשל אם הקובץ לא קיים במערכת הקבצים. יתר על כן, אם לקובץ אין סיומת, זה יביא לכישלון.

3. שימוש חיבור URLC

חיבור URLC מספק מספר ממשקי API לזיהוי סוגי MIME של קובץ. בואו נחקור בקצרה כל אחד מהם.

3.1. באמצעות getContentType ()

אנחנו יכולים להשתמש getContentType () שיטה של חיבור URLC לאחזור סוג MIME של קובץ:

@ מבחן ציבורי בטל כאשרUsingGetContentType_thenSuccess () {File file = קובץ חדש ("product.png"); חיבור URLConnection = file.toURL (). OpenConnection (); מחרוזת mimeType = connection.getContentType (); assertEquals (mimeType, "image / png"); }

עם זאת, החיסרון העיקרי בגישה זו הוא בכך זה איטי מאוד.

3.2. באמצעות guessContentTypeFromName ()

לאחר מכן, בואו נראה כיצד נוכל להשתמש ב- guessContentTypeFromName () למטרת:

@Test הציבור בטל כאשרUsingGuessContentTypeFromName_thenSuccess () {File file = קובץ חדש ("product.png"); מחרוזת mimeType = URLConnection.guessContentTypeFromName (file.getName ()); assertEquals (mimeType, "image / png"); }

שיטה זו עושה שימוש בפנים MapNameMap ל לפתור את סוג MIME מהסיומת.

יש לנו גם אפשרות להשתמש guessContentTypeFromStream () במקום זאת, המשתמש בתווים הראשונים של זרם הקלט, כדי לקבוע את הסוג.

3.3. באמצעות getFileNameMap()

דרך מהירה יותר להשיג את סוג MIME באמצעות חיבור URLC משתמש ב- getFileNameMap () שיטה:

@ מבחן ציבורי בטל כאשר משתמש GetFileNameMap_thenSuccess () {File file = קובץ חדש ("product.png"); FileNameMap fileNameMap = URLConnection.getFileNameMap (); מחרוזת mimeType = fileNameMap.getContentTypeFor (file.getName ()); assertEquals (mimeType, "image / png"); }

השיטה מחזירה את הטבלה של סוגי MIME המשמשים את כל המופעים של חיבור URLC. לאחר מכן משתמשים בטבלה זו כדי לפתור את סוג קובץ הקלט.

הטבלה המובנית מסוגי MIME מוגבלת מאוד בכל הנוגע חיבור URLC.

כברירת מחדל, הכיתה משתמשת תכונות-types.properties קובץ JRE_HOME / lib. אנו יכולים, עם זאת, להאריך אותו על ידי ציון טבלה ספציפית למשתמש באמצעות ה- content.types.user.table תכונה:

System.setProperty ("content.types.user.table", ""); 

4. שימוש MimeTypesFileTypeMap

MimeTypesFileTypeMap פותר סוגי MIME באמצעות סיומת הקובץ. שיעור זה הגיע עם Java 6, ומכאן שהוא מאוד שימושי כשאנחנו עובדים עם JDK 1.6.

בואו נראה כיצד להשתמש בו:

@ מבחן ציבורי בטל כאשרUsingMimeTypesFileTypeMap_thenSuccess () {File file = קובץ חדש ("product.png"); MimetypesFileTypeMap fileTypeMap = MimetypesFileTypeMap חדש (); מחרוזת mimeType = fileTypeMap.getContentType (file.getName ()); assertEquals (mimeType, "image / png"); }

כאן נוכל להעביר את שם הקובץ או את ה- קוֹבֶץ מופע עצמו כפרמטר לפונקציה. עם זאת, הפונקציה עם קוֹבֶץ מופע כפרמטר קורא באופן פנימי לשיטה העמוסה המקבלת את שם הקובץ כפרמטר.

באופן פנימי, שיטה זו מחפשת קובץ שנקרא mime.types לרזולוציית הסוג. חשוב מאוד לציין שהשיטה מחפשת את הקובץ בסדר מסוים:

  1. תוכניות שנוספו לתכנית MimetypesFileTypeMap למשל
  2. .mime.types בספריית הבית של המשתמש
  3. /lib/mime.types
  4. משאבים בשם META-INF / mime.types
  5. משאב בשם META-INF / mimetypes.default (נמצא בדרך כלל רק ב activation.jar קוֹבֶץ)

עם זאת, אם לא נמצא קובץ, הוא יחזור יישום / זרם אוקטט כתגובה.

5. שימוש jMimeMagic

jMimeMagic היא ספרייה עם רישיון מוגבל שנוכל להשתמש בה כדי להשיג את סוג ה- MIME של הקובץ.

נתחיל בתצורת התלות של Maven:

 net.sf.jmimemagic jmimemagic 0.1.5 

אנו יכולים למצוא את הגרסה האחרונה של ספרייה זו ב- Maven Central.

לאחר מכן נבדוק כיצד לעבוד עם הספרייה:

@ מבחן ציבורי בטל כאשר משתמשJmimeMagic_thenSuccess () {קובץ קובץ = קובץ חדש ("product.png"); קסם קסם = קסם חדש (); התאמת MagicMatch = magic.getMagicMatch (קובץ, שקר); assertEquals (match.getMimeType (), "image / png"); }

ספרייה זו יכולה לעבוד עם זרם נתונים ולכן אינה דורשת שהקובץ יהיה נוכח במערכת הקבצים.

6. שימוש באפצ'י טיקה

אפאצ'י טיקה הוא ערכת כלים שמאתרת ומוציאה מטא נתונים וטקסט ממגוון קבצים. יש לו ממשק API עשיר וחזק ומגיע עם Tika-core בו אנו יכולים להשתמש, לצורך איתור סוג MIME של קובץ.

נתחיל בתצורת התלות של Maven:

 org.apache.tika tika-core 1.18 

לאחר מכן נשתמש ב- לזהות() שיטה לפתרון הסוג:

@ מבחן ציבורי בטל כאשר משתמשיםTika_thenSuccess () {קובץ קובץ = קובץ חדש ("product.png"); טיקה טיקה = טיקה חדשה (); מחרוזת mimeType = tika.detect (קובץ); assertEquals (mimeType, "image / png"); }

הספרייה מסתמכת על סמני קסם בקידומת הזרם, לצורך רזולוציית סוג.

7. מסקנה

במאמר זה בדקנו את האסטרטגיות השונות להשגת סוג MIME של קובץ. יתר על כן, ניתחנו גם את פשרות הגישות. ציינו גם את התרחישים שבהם עלינו להעדיף אסטרטגיה אחת על פני השנייה.

קוד המקור המלא המשמש במאמר זה זמין באתר GitHub, כמו תמיד.


$config[zx-auto] not found$config[zx-overlay] not found