대부분의 사람들이 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 Tika 는 tika-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");