[java] Java에서 파일의 Mime 유형 가져 오기

대부분의 사람들이 Java의 파일에서 MIME 유형을 가져 오는 방법이 궁금합니다. 지금까지 두 가지 유틸리티를 시도했습니다 : JMimeMagic& Mime-Util.

첫 번째는 메모리 예외를 주었고 두 번째는 스트림을 올바르게 닫지 않습니다. 다른 사람이 올바르게 사용하고 올바르게 작동하는 방법 / 라이브러리가 있는지 궁금합니다.



답변

Java 7에서는 이제을 사용할 수 있습니다 Files.probeContentType(path).


답변

운수 나쁘게,

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

URL을 사용하면 파일이 잠기므로 예를 들어 삭제할 수 없으므로 작동하지 않습니다.

그러나 당신은 이것을 가지고 있습니다 :

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

또한 파일 확장을 사용하는 것 이상의 이점을 가지고 있으며 내용을 엿볼 수있는 다음 사항

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

그러나 위의 의견에서 제안한 것처럼 내장 마임 유형 표는 예를 들어 MSWord 및 PDF를 포함하지 않고 상당히 제한적입니다. 따라서 일반화하려면 Mime-Util (파일 확장자와 내용을 모두 사용하는 훌륭한 라이브러리)과 같은 내장 라이브러리를 넘어서야합니다.


답변

JAF API는 JDK 6의 일부입니다 javax.activation. 패키지를 보십시오 .

가장 흥미로운 클래스는 javax.activation.MimeType실제 MIME 형식 홀더이며 javax.activation.MimetypesFileTypeMap인스턴스가 파일의 MIME 형식을 문자열로 확인할 수있는 클래스입니다.

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);


답변

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 를 참조하십시오.


답변

Apache Tikatika-core 에서 스트림 접두사의 매직 마커를 기반으로 한 MIME 유형 감지 기능을 제공합니다. tika-core다른 의존성을 가져 오지 않으므로 현재 유지 관리되지 않는 Mime 유형 감지 유틸리티 만큼 가벼워집니다 .

간단한 코드 예제 (자바 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 에서 제공됩니다 .


답변

Android 개발자 인 경우 유틸리티 클래스를 사용할 수 있습니다 android.webkit.MimeTypeMap MIME 유형을 파일 확장자에 매핑하거나 그 반대로 매핑 를 .

다음 코드 스 니펫이 도움이 될 수 있습니다.

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


답변

에서 roseindia :

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