문제

나는 대부분의 사람들이 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

그러나 위의 설명에서 알 수 있듯이 내장된 MIME 유형 테이블은 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);

와 함께 아파치 티카 너만 필요해 세 줄의 코드:

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

멋진 콘솔이 있다면 다음 코드를 붙여넣고 실행하여 사용해 보세요.

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

보다 아피독스 자세한 내용은.

아파치 티카 제공 티카 코어 스트림 접두사의 매직 마커를 기반으로 MIME 유형 감지. tika-core 다른 종속성을 가져오지 않으므로 현재 유지 관리되지 않는 것만큼 가볍습니다. 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.

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

다음 코드 조각이 도움이 될 수 있습니다.

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

에서 로인디아:

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

Java 5-6에서 막힌 경우 그런 다음 이 유틸리티 클래스는 Servoy 오픈 소스 제품.

이 기능만 있으면 됩니다

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

콘텐츠의 첫 번째 바이트를 조사하고 파일 확장자가 아닌 해당 콘텐츠를 기반으로 콘텐츠 유형을 반환합니다.

나는 대부분의 사람들이 Java 파일에서 MIME 유형을 어떻게 가져오는지 궁금합니다.

나는 내 것을 출판했다 심플매직 파일 및 바이트 배열에서 콘텐츠 유형(MIME 유형) 결정을 허용하는 Java 패키지입니다.이는 대부분의 Unix OS 구성의 일부인 Unix file(1) 명령 매직 파일을 읽고 실행하도록 설계되었습니다.

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

내 5센트로 돈을 벌려면:

TL,DR

나는 사용한다 Mimetypes파일 유형맵 거기에 없고 특별히 필요한 MIME을 mime.types 파일에 추가하세요.

그리고 지금, 오랫동안 읽어보세요:

우선 MIME 유형 목록은 다음과 같습니다. 거대한, 여기를 보아라: https://www.iana.org/locationments/media-types/media-types.xhtml

나는 JDK에서 제공하는 표준 기능을 먼저 사용하고, 그래도 작동하지 않으면 가서 다른 것을 찾아볼 것입니다.

파일 확장자로 파일 유형 결정

1.6부터 Java에는 위의 답변 중 하나에서 지적한 것처럼 MimetypesFileTypeMap이 있으며 이는 MIME 유형을 결정하는 가장 간단한 방법입니다.

new MimetypesFileTypeMap().getContentType( fileName );

바닐라 구현에서는 그다지 많은 일을 하지 않습니다(예:.html에서는 작동하지만 .png에서는 작동하지 않습니다.)그러나 필요한 콘텐츠 유형을 추가하는 것은 매우 간단합니다.

  1. 프로젝트의 META-INF 폴더에 'mime.types'라는 파일을 만듭니다.
  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를 정의합니다. 구현 특정 방법.

파일의 MIME 유형을 가져오려면 간단히 다음을 사용하면 됩니다. 파일 코드에서 다음을 수행하세요.

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

API 정의는 파일 이름이나 파일 콘텐츠(매직 바이트)에서 파일 MIME 유형을 결정하는 기능을 지원하는 기능을 제공합니다.그렇기 때문에 프로브컨텐트유형() 이 API의 구현이 제공된 Path를 사용하여 실제로 연결된 파일을 열려고 시도하는 경우 메서드는 IOException을 발생시킵니다.

또 바닐라 구현 이 중(JDK와 함께 제공되는 것)에는 아쉬운 점이 많습니다.

아주 멀리 떨어진 은하계의 이상적인 세계에서 이 파일-마임 유형 문제를 해결하려는 모든 라이브러리는 간단히 구현합니다. java.nio.file.spi.FileTypeDetector, 선호하는 구현 라이브러리의 jar 파일을 클래스 경로에 넣으면 됩니다.

현실 세계에서 TL, DR 섹션이 필요한 곳은 이름 옆에 별표가 가장 많은 라이브러리를 찾아 사용해야 합니다.이 특별한 경우에는 (아직;) 필요하지 않습니다.

@Joshua Fox가 말한 첫 번째 방법을 포함하여 여러 가지 방법을 시도했습니다.그러나 일부는 PDF 파일과 같이 자주 사용되는 MIME 유형을 인식하지 못하고 다른 일부는 가짜 파일로 신뢰할 수 없습니다(확장자가 TIF로 변경된 RAR 파일로 시도했습니다).@Joshua Fox가 피상적으로 말했듯이 내가 찾은 해결책은 다음을 사용하는 것입니다. MimeUtil2, 이와 같이:

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

파일 업로드에는 두 계층 유효성 검사를 사용하는 것이 좋습니다.

먼저 mimeType을 확인하고 유효성을 검사할 수 있습니다.

두 번째로 파일의 처음 4바이트를 16진수로 변환한 다음 이를 매직 넘버와 비교해야 합니다.그러면 파일 유효성 검사를 확인하는 정말 안전한 방법이 될 것입니다.

봄에 멀티파트파일 파일;

org.springframework.web.multipart.MultipartFile

file.getContentType();

이 작업을 수행하기 위해 제가 찾은 가장 간단한 방법은 다음과 같습니다.

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

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'

다양한 다른 라이브러리를 시도한 후 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);
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;
}

단 한 줄로 할 수 있습니다: MimetypesFileTypeMap().getContentType(new File("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")));
    }
}

이 코드는 다음과 같은 출력을 생성합니다. 텍스트/일반

File file = new File(PropertiesReader.FILE_PATH);
MimetypesFileTypeMap fileTypeMap = new MimetypesFileTypeMap();
String mimeType = fileTypeMap.getContentType(file);
URLConnection uconnection = file.toURL().openConnection();
mimeType = uconnection.getContentType();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top