รับประเภท Mime ของไฟล์ใน Java


336

ฉันแค่สงสัยว่าคนส่วนใหญ่เรียกประเภท mime จากไฟล์ใน Java ได้อย่างไร จนถึงตอนนี้ฉันได้ลองสองสิ่ง: JMimeMagic& Mime-Util.

ครั้งแรกให้ฉันข้อยกเว้นหน่วยความจำที่สองไม่ได้ปิดกระแสออกอย่างถูกต้อง ฉันแค่สงสัยว่าใครมีวิธีการ / ไลบรารีที่พวกเขาใช้และทำงานอย่างถูกต้องหรือไม่


4
ภาพรวมที่ดีเกี่ยวกับห้องสมุดที่มีอยู่มีให้ที่rgagnon.com/javadetails/java-0487.html
koppor

ฉันใช้คลาสที่โพสต์เป็นคำตอบที่นี่: stackoverflow.com/a/10140531/293280
Joshua Pinter

3
Tika ควรเป็นคำตอบตอนนี้ คำตอบอื่น ๆ ด้านล่างทำให้เข้าใจถึงการพึ่งพา Tika ได้หลายอย่าง แต่ฉันไม่เห็นเลยว่ามี tika-core
javamonkey79

@ javamonkey79 เมื่อเราใช้ TIka มันจะทำการแปลงไฟล์และมันจะไม่สามารถใช้งานได้อีกต่อไป String contentType = tika.detect (คือ)
เท่เย็น

คำตอบ:


326

ใน Java 7 คุณสามารถใช้งานFiles.probeContentType(path)ได้ทันที


62
โปรดระวังว่า Files.probeContentType (Path) เป็นรถในระบบปฏิบัติการหลายระบบและมีการรายงานข้อผิดพลาดจำนวนมาก ฉันมีปัญหากับซอฟต์แวร์ที่ทำงานบน Ubuntu แต่ล้มเหลวบน windows ดูเหมือนว่าใน windows Files.probeContentType (Path) จะส่งคืนค่าว่างเสมอ มันไม่ใช่ระบบของฉันดังนั้นฉันจึงไม่ได้ตรวจสอบรุ่น JRE หรือ windows มันเป็น windows 7 หรือ 8 อาจมี oracle JRE สำหรับ java 7
Silver

13
ฉันทำงานบน OS X 10.9 และฉันได้รับnullออกไปสำหรับ.xml, .pngและ.xhtmlไฟล์ ฉันไม่รู้ว่าฉันเพิ่งทำสิ่งผิดปกติอย่างรุนแรงหรือไม่

36
ข้อ จำกัด ที่สำคัญคือสิ่งนี้คือไฟล์จะต้องมีอยู่ในระบบไฟล์ วิธีนี้ใช้ไม่ได้กับสตรีมหรืออาร์เรย์ไบต์เป็นต้น
Necreaux

3
วิธีนี้ไม่สามารถคืนค่าชนิด mime เมื่อฉันลบส่วนขยายออกจากชื่อสำหรับ exmaple ถ้าชื่อคือ test.mp4 ฉันเปลี่ยนเป็น "ทดสอบ" และวิธีการส่งกลับค่า null.Also ฉันเปลี่ยนนามสกุลภาพยนตร์เป็น png ฯลฯ มันคืนประเภท png mime
Sarkhan

10
สิ่งนี้ไม่มีประโยชน์หากไฟล์นั้นมีนามสกุลที่ขาดหายไปหรือผิด
shmosel

215

น่าเสียดาย,

mimeType = file.toURL().openConnection().getContentType();

ไม่ทำงานเนื่องจากการใช้ URL นี้ทำให้ไฟล์ถูกล็อคดังนั้นจึงไม่สามารถยกเลิกการลบได้

อย่างไรก็ตามคุณมีสิ่งนี้:

mimeType= URLConnection.guessContentTypeFromName(file.getName());

และต่อไปนี้ซึ่งมีข้อได้เปรียบในการก้าวข้ามการใช้นามสกุลไฟล์และมองที่เนื้อหา

InputStream is = new BufferedInputStream(new FileInputStream(file));
mimeType = URLConnection.guessContentTypeFromStream(is);
 //...close stream

อย่างไรก็ตามตามคำแนะนำข้างต้นตาราง mime-type ในตัวมีข้อ จำกัด ค่อนข้างมากไม่รวมถึง MSWord และ PDF ดังนั้นหากคุณต้องการพูดคุยคุณจะต้องไปไกลกว่าห้องสมุดในตัวเช่น Mime-Util (ซึ่งเป็นห้องสมุดที่ยอดเยี่ยมโดยใช้ทั้งส่วนขยายของไฟล์และเนื้อหา)


8
โซลูชั่นที่สมบูรณ์แบบ - ช่วยฉันได้มาก! ตัดFileInputStreamเข้าBufferedInputStreamเป็นส่วนหนึ่งที่สำคัญ - มิฉะนั้นguessContentTypeFromStreamผลตอบแทนnull(ผ่านInputStreamอินสแตนซ์ควรสนับสนุนเครื่องหมาย)
Yuriy Nakonechnyy

11
Howerver URLConnectionมีประเภทเนื้อหาที่ จำกัด อย่างมากที่จำได้ ตัวอย่างเช่นไม่สามารถตรวจจับapplication/pdfได้
kpentchev

3
มันปล่อยให้มันล็อคเพียงเพราะคุณไม่ได้ปิดตัวเอง การตัดการเชื่อมต่อ URLConnection จะเป็นการปลดล็อค
มาร์ควิสแห่ง Lorne

1
ทั้ง guessContentTypeFromStream และ guessContentTypeFromName ไม่รู้จักเช่น mp4
Hartmut P.

3
guessContentTypeFromName()ใช้$JAVA_HOME/lib/content-types.propertiesไฟล์เริ่มต้น คุณสามารถเพิ่มไฟล์เสริมของคุณเองโดยเปลี่ยนคุณสมบัติของระบบSystem.setProperty("content.types.user.table","/lib/path/to/your/property/file");
Rasika Perera

50

JAF API เป็นส่วนหนึ่งของ JDK 6 ดูjavax.activationแพ็คเกจ

คลาสที่น่าสนใจที่สุดคือjavax.activation.MimeType- ตัวยึดชนิด MIME จริง - และjavax.activation.MimetypesFileTypeMap- คลาสซึ่งอินสแตนซ์สามารถแก้ไขชนิด MIME เป็น String สำหรับไฟล์:

String fileName = "/path/to/file";
MimetypesFileTypeMap mimeTypesMap = new MimetypesFileTypeMap();

// only by file name
String mimeType = mimeTypesMap.getContentType(fileName);

// or by actual File instance
File file = new File(fileName);
mimeType = mimeTypesMap.getContentType(file);

4
แต่น่าเสียดายที่เป็น Javadoc สำหรับgetContentType(File)รัฐ: ส่งคืนชนิดไมม์ของไฟล์การดำเนิน object.The getContentType(f.getName())ในชั้นเรียนสายนี้
Matyas

3
และจำไว้ว่าคุณสามารถขยายฟังก์ชั่นนี้ด้วยไฟล์ META-INF / mime.types ดังนั้นจึงสมบูรณ์แบบถ้าคุณถูกบังคับให้ใช้ Java 6 docs.oracle.com/javaee/5/api/javax/activation/
Chexpir

8
คุณสามารถข้ามการสร้างวัตถุใหม่โดยMimetypesFileTypeMap.getDefaultFileTypeMap().getContentType(file)
akostadinov

ขอบคุณสำหรับคำตอบ. มันทำงานได้ดีสำหรับฉัน
Radadiya Nikunj

แต่มันก็ยังกลับมาประเภทเนื้อหาตามชื่อไฟล์เท่านั้น และนี่เป็นอันตรายอย่างยิ่งสำหรับไฟล์ที่อัพโหลดโดยผู้ใช้
Sergey Ponomarev

47

ด้วยApache Tikaคุณต้องการโค้ดเพียงสามบรรทัด :

File file = new File("/path/to/file");
Tika tika = new Tika();
System.out.println(tika.detect(file));

หากคุณมีคอนโซล Groovy เพียงแค่วางและเรียกใช้รหัสนี้เพื่อเล่นกับมัน:

@Grab('org.apache.tika:tika-core:1.14')
import org.apache.tika.Tika;

def tika = new Tika()
def file = new File("/path/to/file")
println tika.detect(file)

โปรดทราบว่า API ของมันอุดมไปด้วยก็สามารถแยก "อะไร" ตั้งแต่ tika-core 1.14 คุณมี:

String  detect(byte[] prefix)
String  detect(byte[] prefix, String name)
String  detect(File file)
String  detect(InputStream stream)
String  detect(InputStream stream, Metadata metadata)
String  detect(InputStream stream, String name)
String  detect(Path path)
String  detect(String name)
String  detect(URL url)

ดูapidocsสำหรับข้อมูลเพิ่มเติม


1
มันใช้ไม่ได้กับ csv WTF? stackoverflow.com/questions/46960231/…
gstackoverflow

1
สิ่งหนึ่งที่ไม่ดีเกี่ยวกับ Tika การพึ่งพาอาศัยกันมากมาย มันเพิ่มขนาดโถของฉัน 54MB !!!
helmy

1
@helmyTika 1.17 เป็นแบบสแตนด์อโลนและมีขนาดใหญ่เพียง 648 KB
Sainan

... หรือเพียงแค่new Tika().detect(file.toPath())การตรวจจับโดยใช้นามสกุลไฟล์มากกว่าการตรวจจับตามเนื้อหาของไฟล์
Lu55

@ เอกสาร Lu55 บอกว่ายังคงใช้เนื้อหาเอกสาร ฉันคิดว่าคุณหมายถึงnew Tika().detect(file.getPath())ซึ่งใช้นามสกุลไฟล์เท่านั้น
delucasvb

31

Apache Tika ให้บริการการตรวจจับประเภทmika บน tika-coreโดยอิงจากเครื่องหมายเวทย์มนตร์ในส่วนนำหน้าสตรีม tika-coreไม่สามารถดึงข้อมูลอ้างอิงอื่น ๆ ซึ่งจะทำให้มันเป็นที่มีน้ำหนักเบาเป็น unmaintained ขณะMime การตรวจสอบอาคารประเภท

ตัวอย่างโค้ดแบบง่าย (Java 7) โดยใช้ตัวแปรtheInputStreamและtheFileName

try (InputStream is = theInputStream;
        BufferedInputStream bis = new BufferedInputStream(is);) {
    AutoDetectParser parser = new AutoDetectParser();
    Detector detector = parser.getDetector();
    Metadata md = new Metadata();
    md.add(Metadata.RESOURCE_NAME_KEY, theFileName);
    MediaType mediaType = detector.detect(bis, md);
    return mediaType.toString();
}

โปรดทราบว่า MediaType.detect (... ) ไม่สามารถใช้งานได้โดยตรง ( TIKA-1120 ) คำแนะนำเพิ่มเติมให้ที่https://tika.apache.org/0.10/detection.html


1
+1 นอกจากนี้ยังMetadata.RESOURCE_NAME_KEYสามารถละเว้นได้ (หากคุณไม่มีชื่อใด ๆ หรือไม่สามารถเชื่อถือได้) แต่ในกรณีนั้นคุณจะได้ผลลัพธ์ที่ผิดในบางกรณี (เช่นเอกสารสำนักงาน)
user1516873

มันมีปัญหาบางอย่างที่ตรวจพบ XLSX หากไม่มีส่วนขยายของชื่อไฟล์ ... แต่วิธีนี้ง่ายและสง่างาม
Oscar Pérez

23

หากคุณเป็นนักพัฒนา Android คุณสามารถใช้คลาสยูทิลิตี้android.webkit.MimeTypeMapซึ่งแมปประเภท MIME กับนามสกุลไฟล์และในทางกลับกัน

ข้อมูลโค้ดต่อไปนี้อาจช่วยคุณได้

private static String getMimeType(String fileUrl) {
    String extension = MimeTypeMap.getFileExtensionFromUrl(fileUrl);
    return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
}

3
วิธีนี้จะใช้งานได้หากลองกับพา ธ ของไฟล์ในเครื่องเช่น "/sdcard/path/to/video.extension" ปัญหาคือถ้าไฟล์ท้องถิ่นมีพื้นที่ในเส้นทางของมันก็มักจะส่งกลับ null
nmxprime

17

จากroseindia :

FileNameMap fileNameMap = URLConnection.getFileNameMap();
String mimeType = fileNameMap.getContentTypeFor("alert.gif");

7
ใครก็ตามที่ลงคะแนนในคำตอบโปรดเพิ่มความคิดเห็นเพื่อที่ฉัน (และคนอื่น ๆ ) อาจเรียนรู้ที่จะโพสต์คำตอบที่ดีกว่า
AlikElzin-kilaka

3
ฉันไม่ได้ลงคะแนนให้คุณ แต่ getFileNameMap ไม่สามารถใช้ได้กับไฟล์พื้นฐานหลายประเภทเช่น 'bmp' นอกจากนี้ URLConnection.guessContentTypeFromName จะส่งคืนสิ่งเดียวกัน
Ovidiu Buligan

5
ฟังก์ชั่นที่ไม่สมบูรณ์มาก ในฐานะของ Java 7, ส่วนขยาย html, pdf และ jpeg จะคืนค่า mime-type ที่ถูกต้อง แต่ js และ css คืนค่า null!
djsumdog

ฉันทดสอบด้วย 'webm' และคืนค่าเป็นศูนย์
Henrique Rocha

16

หากคุณกำลังติดอยู่กับจาวา 5-6แล้วระดับยูทิลิตี้นี้จากservoy สินค้าโอเพนซอร์ส

คุณต้องการฟังก์ชั่นนี้เท่านั้น

public static String getContentType(byte[] data, String name)

มันจะตรวจสอบไบต์แรกของเนื้อหาและส่งคืนชนิดเนื้อหาตามเนื้อหานั้นไม่ใช่ตามนามสกุลไฟล์


ทำงานได้กับไฟล์ที่เรียบง่ายเป็นที่นิยมและมีไม่กี่ชนิดที่ฉันต้องการ :)
user489041

13

ฉันแค่สงสัยว่าคนส่วนใหญ่เรียกประเภท mime จากไฟล์ใน Java ได้อย่างไร

ฉันเผยแพร่แพ็คเกจSimpleMagic Java ซึ่งอนุญาตการกำหนดประเภทเนื้อหา (ประเภท mime) จากไฟล์และอาร์เรย์ไบต์ มันถูกออกแบบมาเพื่ออ่านและเรียกใช้ไฟล์มายากลคำสั่ง Unix (1) ไฟล์ที่เป็นส่วนหนึ่งของการกำหนดค่า ~ Unix OS ส่วนใหญ่

ฉันลอง Apache Tika แต่มันมีขนาดใหญ่ที่มีการพึ่งพาจำนวนมากURLConnectionไม่ใช้ไบต์ของไฟล์และMimetypesFileTypeMapเพียงแค่ดูที่ชื่อไฟล์

ด้วย SimpleMagic คุณสามารถทำสิ่งต่อไปนี้:

// create a magic utility using the internal magic file
ContentInfoUtil util = new ContentInfoUtil();
// if you want to use a different config file(s), you can load them by hand:
// ContentInfoUtil util = new ContentInfoUtil("/etc/magic");
...
ContentInfo info = util.findMatch("/tmp/upload.tmp");
// or
ContentInfo info = util.findMatch(inputStream);
// or
ContentInfo info = util.findMatch(contentByteArray);

// null if no match
if (info != null) {
   String mimeType = info.getMimeType();
}

1
ทดสอบกับไฟล์ภาพหลายไฟล์ ทั้งหมดมีนามสกุลถูกเปลี่ยนชื่อ ห้องสมุดที่ยอดเยี่ยมของคุณจัดการอย่างเหมาะสม แน่นอนว่ามันเบาเกินไป :)
saurabheights

1
ใช่มันใช้งานได้ดี และสำหรับผู้ที่ต้องการใช้โซลูชันนี้ภายใน Android คุณสามารถรวมสิ่งต่อไปนี้ในไฟล์ build.gradle: คอมไพล์ ('com.j256.simplemagic: simplemagic: 1.10')
jkincali

1
นี่เป็นทางออกที่ยอดเยี่ยม! ขอบคุณ!
javydreamercsw

5

วิธีชิปด้วย 5 เซ็นต์ของฉัน:

TL, DR

ฉันใช้MimetypesFileTypeMapและเพิ่ม mime ใด ๆ ที่ไม่ได้อยู่ที่นั่นและฉันต้องการมันเป็นพิเศษในไฟล์ mime.types

และตอนนี้อ่านยาว:

ก่อนอื่นรายการประเภท MIME นั้นใหญ่มากดูได้ที่นี่: https://www.iana.org/assignments/media-types/media-types.xhtml

ฉันชอบใช้สิ่งอำนวยความสะดวกมาตรฐานที่ JDK จัดไว้ให้ก่อนและถ้าไม่ได้ผลฉันจะไปหาสิ่งอื่นแทน

กำหนดประเภทไฟล์จากนามสกุลไฟล์

ตั้งแต่ 1.6, Java มี MimetypesFileTypeMap ตามที่ระบุไว้ในคำตอบข้อใดข้อหนึ่งข้างต้นและเป็นวิธีที่ง่ายที่สุดในการกำหนดประเภท mime:

new MimetypesFileTypeMap().getContentType( fileName );

ในการติดตั้งวานิลลามันไม่ได้ทำอะไรมากมาย (เช่นใช้งานได้กับ. html แต่ไม่เหมาะสำหรับ. png) อย่างไรก็ตามเป็นเรื่องง่ายมากที่จะเพิ่มประเภทเนื้อหาใด ๆ ที่คุณอาจต้องการ:

  1. สร้างไฟล์ชื่อ 'mime.types' ในโฟลเดอร์ META-INF ในโครงการของคุณ
  2. เพิ่มบรรทัดสำหรับทุกประเภท mime ที่คุณต้องการและการใช้งานเริ่มต้นไม่ได้จัดเตรียมไว้ให้ (มีประเภทและรายการ mime หลายร้อยรายการเมื่อเวลาผ่านไป)

ตัวอย่างรายการสำหรับไฟล์ png และ js คือ:

image/png png PNG
application/javascript js

สำหรับรูปแบบไฟล์ mime.types ดูรายละเอียดเพิ่มเติมได้ที่นี่: https://docs.oracle.com/javase/7/docs/api/javax/activation/MimetypesFileTypeMap.html

กำหนดประเภทไฟล์จากเนื้อหาไฟล์

ตั้งแต่ 1.7, Java มีjava.nio.file.spi.FileTypeDetectorซึ่งได้กำหนดมาตรฐาน API สำหรับการกำหนดประเภทของไฟล์ในวิธีการเฉพาะการดำเนินงาน

ในการดึงข้อมูลประเภทไฟล์สำหรับไฟล์คุณเพียงแค่ใช้ไฟล์และทำสิ่งนี้ในรหัสของคุณ:

Files.probeContentType(Paths.get("either file name or full path goes here"));

นิยาม API จัดเตรียมสิ่งอำนวยความสะดวกที่สนับสนุนทั้งการพิจารณาชนิดไฟล์ mime จากชื่อไฟล์หรือจากเนื้อหาไฟล์ (magic bytes) นั่นคือเหตุผลที่probeContentType ()วิธีการโยน IOException ในกรณีที่การใช้งานของ API นี้ใช้เส้นทางที่ให้ไว้เพื่อที่จะพยายามเปิดไฟล์ที่เกี่ยวข้อง

อีกครั้งการใช้วานิลลาของสิ่งนี้ (อันที่มาพร้อมกับ JDK) ทำให้เป็นที่ต้องการอย่างมาก

ในโลกอุดมคติบางแห่งในกาแลคซีที่อยู่ห่างไกลห้องสมุดทั้งหมดเหล่านี้ซึ่งพยายามที่จะแก้ปัญหาแบบไฟล์ต่อไฟล์ mime นี้จะนำjava.nio.file.spi.FileTypeDetectorไปใช้งาน ไฟล์ลงใน classpath ของคุณและที่จะเป็น

ในโลกแห่งความจริงซึ่งเป็นส่วนที่คุณต้องการ TL, DR คุณควรหาห้องสมุดที่มีดาวส่วนใหญ่อยู่ถัดจากชื่อและใช้งาน สำหรับกรณีนี้ฉันไม่ต้องการ (แต่;))


3

ฉันพยายามทำหลายวิธีรวมถึงวิธีแรกที่ @Joshua Fox พูด แต่บางคนไม่รู้จักชนิดไฟล์ที่พบบ่อยเช่นไฟล์ PDF และอื่น ๆ ไม่สามารถเชื่อถือได้กับไฟล์ปลอม (ฉันลองใช้ไฟล์ RAR ที่มีนามสกุลเปลี่ยนเป็น TIF) วิธีการแก้ปัญหาที่ฉันพบตามที่กล่าวไว้โดย @Joshua Fox อย่างผิวเผินคือการใช้MimeUtil2เช่นนี้:

MimeUtil2 mimeUtil = new MimeUtil2();
mimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector");
String mimeType = MimeUtil2.getMostSpecificMimeType(mimeUtil.getMimeTypes(file)).toString();

5
ฉันไม่ประสบความสำเร็จเลยด้วย MimeUtil2 - เกือบทุกอย่างกลับมาเป็น application / octet-stream ฉันใช้ MimeUtil.getMimeTypes () ที่มีความสำเร็จมากขึ้นหลังจากเริ่มต้นด้วย `MimeUtil.registerMimeDetector (" eu.medsea.mimeutil.detector.MagicMimeMimeDetector "); MimeUtil.registerMimeDetector ( "eu.medsea.mimeutil.detector.ExtensionMimeDetector"); MimeUtil.registerMimeDetector ( "eu.medsea.mimeutil.detector.OpendesktopMimeDetector"); `
Brian Pipa

2
ขอบคุณสำหรับการแก้ปัญหาการทำงาน เอกสารของ mime-util ไม่ชัดเจนเกี่ยวกับวิธีสร้างอินสแตนซ์คลาสยูทิลิตี้ ในที่สุดมันก็ขึ้นและทำงาน แต่แทนที่สตริงชื่อ class ด้วยระดับที่เกิดขึ้นจริง MimeUtil.registerMimeDetector (ExtensionMimeDetector.class.getName ()); String mimeType = MimeUtil.getMostSpecificMimeType (MimeUtil.getMimeTypes (ชื่อไฟล์)) toString ();
Rob Juurlink

2

เป็นการดีกว่าที่จะใช้การตรวจสอบสองชั้นสำหรับการอัปโหลดไฟล์

ก่อนอื่นคุณสามารถตรวจสอบ mimeType และตรวจสอบมัน

ขั้นที่สองคุณควรแปลงไฟล์ 4 ไบต์แรกให้เป็นเลขฐานสิบหกแล้วเปรียบเทียบกับตัวเลขเวทย์มนตร์ จากนั้นจะเป็นวิธีที่ปลอดภัยจริงๆในการตรวจสอบความถูกต้องของไฟล์


2

นี่เป็นวิธีที่ง่ายที่สุดที่ฉันพบในการทำสิ่งนี้:

byte[] byteArray = ...
InputStream is = new BufferedInputStream(new ByteArrayInputStream(byteArray));
String mimeType = URLConnection.guessContentTypeFromStream(is);

ทางออกที่ดีที่สุด!
Sherzod

2

หากคุณกำลังทำงานกับ Servlet และถ้าบริบท servlet พร้อมใช้งานสำหรับคุณคุณสามารถใช้:

getServletContext().getMimeType( fileName );

1
คือgetServletContextอะไร
e-info128


0

หากคุณทำงานบน linux OS จะมีบรรทัดคำสั่งfile --mimetype:

String mimetype(file){

   //1. run cmd
   Object cmd=Runtime.getRuntime().exec("file --mime-type "+file);

   //2 get output of cmd , then 
    //3. parse mimetype
    if(output){return output.split(":")[1].trim(); }
    return "";
}

แล้วก็

mimetype("/home/nyapp.war") //  'application/zip'

mimetype("/var/www/ggg/au.mp3") //  'audio/mp3'

2
สิ่งนี้จะใช้งานได้ แต่เป็น IMO ที่เป็นการปฏิบัติที่ไม่ถูกต้องเนื่องจากมันเชื่อมโยงรหัสของคุณกับระบบปฏิบัติการเฉพาะและต้องการให้มียูทิลิตี้ภายนอกแสดงอยู่ในระบบที่ใช้งาน อย่าเข้าใจฉันผิด มันเป็นทางออกที่ถูกต้อง แต่หยุดพักการพกพา - ซึ่งเป็นหนึ่งในเหตุผลหลักในการใช้ Java ในตอนแรก ...
ToVine

@ ToVine: สำหรับบันทึกฉันจะไม่เห็นด้วยอย่างเคารพ ไม่ใช่ทุกโปรแกรม Java ที่จะต้องพกพา ให้บริบทและโปรแกรมเมอร์ทำการตัดสินใจ en.wikipedia.org/wiki/Java_Native_Interface
Zahnon

0

หลังจากลองห้องสมุดอื่น ๆ ฉันก็ตัดสินด้วย mime-util

<groupId>eu.medsea.mimeutil</groupId>
      <artifactId>mime-util</artifactId>
      <version>2.1.3</version>
</dependency>

File file = new File("D:/test.tif");
MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector");
Collection<?> mimeTypes = MimeUtil.getMimeTypes(file);
System.out.println(mimeTypes);

0
public String getFileContentType(String fileName) {
    String fileType = "Undetermined";
    final File file = new File(fileName);
    try
    {
        fileType = Files.probeContentType(file.toPath());
    }
    catch (IOException ioException)
    {
        System.out.println(
                "ERROR: Unable to determine file type for " + fileName
                        + " due to exception " + ioException);
    }
    return fileType;
}

วิธีการนี้ Files.probeContentType (String) มีให้ตั้งแต่ JDK รุ่น 1.7 และมันใช้งานได้ดีมากสำหรับฉัน
Reza Rahimi

ขอบคุณเฉพาะฉันไม่เข้าใจว่าทำไมผู้ใช้บางคนถึงลงคะแนน)))
Vazgen Torosyan

ไม่เลยบางทีพวกเขาอาจมี JDK รุ่นก่อนหน้า :)))
Reza Rahimi

0

คุณสามารถทำมันมีเพียงหนึ่งบรรทัด: MimetypesFileTypeMap () getContentType (ไฟล์ใหม่ ( "filename.ext")). ดูรหัสทดสอบที่สมบูรณ์ (Java 7):

import java.io.File;
import javax.activation.MimetypesFileTypeMap;
public class MimeTest {
    public static void main(String a[]){
         System.out.println(new MimetypesFileTypeMap().getContentType(
           new File("/path/filename.txt")));
    }
}

รหัสนี้สร้างผลลัพธ์ต่อไปนี้: text / plain


0
File file = new File(PropertiesReader.FILE_PATH);
MimetypesFileTypeMap fileTypeMap = new MimetypesFileTypeMap();
String mimeType = fileTypeMap.getContentType(file);
URLConnection uconnection = file.toURL().openConnection();
mimeType = uconnection.getContentType();

4
ในขณะที่รหัสนี้อาจแก้ปัญหารวมถึงคำอธิบายช่วยปรับปรุงคุณภาพของโพสต์ของคุณ
ศรี

0

ฉันทำมันด้วยรหัสต่อไปนี้

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class MimeFileType {

    public static void main(String args[]){

        try{
            URL url = new URL ("https://www.url.com.pdf");

            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setDoOutput(true);
            InputStream content = (InputStream)connection.getInputStream();
            connection.getHeaderField("Content-Type");

            System.out.println("Content-Type "+ connection.getHeaderField("Content-Type"));

            BufferedReader in = new BufferedReader (new InputStreamReader(content));

        }catch (Exception e){

        }
    }
}

0

Apache Tika

<!-- https://mvnrepository.com/artifact/org.apache.tika/tika-parsers -->
<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-parsers</artifactId>
    <version>1.24</version>
</dependency>

และโค้ดสองบรรทัด

Tika tika=new Tika();
tika.detect(inputStream);

ภาพหน้าจอด้านล่าง

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.