2012-11-30 2 views
26

Amazon S3 버킷에 파일을 업로드하고 원본 파일 이름이 아닌 파일의 MIME 유형을 포함하는 InputStream 및 String에 액세스 할 수 있습니다. 파일을 S3까지 밀어 넣기 전에 실제로 파일 이름과 확장명을 만드는 것은 나에게 달려있다. 라이브러리가 있거나 MIME 형식에서 사용할 적절한 확장을 결정하는 편리한 방법이 있습니까?Java에서 MIME 유형의 적절한 파일 확장자를 결정하는 방법

Apache Tika 라이브러리에 대한 참조가 있지만 과장된 것처럼 보입니다. 아직 파일 확장명을 감지하지 못했습니다. 이 코드가 작동합니다 것 같다 수집 할 수있었습니다,하지만 commentors의 일부가 지적했듯이 내 타입 변수 "이미지/JPEG"

MimeType mimeType = null; 
    try { 
     mimeType = new MimeTypes().forName(type); 
    } catch (MimeTypeException e) { 
     Logger.error("Couldn't Detect Mime Type for type: " + type, e); 
    } 

    if (mimeType != null) { 
     String extension = mimeType.getExtension(); 
     //do something with the extension 
    } 
+1

파일 확장자를 설정해야합니까? MIME 타입을 알고 있다면, 적당한'Content-Type'으로 S3에 업로드 할 수 있으며 확장자 (보통)는 무의미해진다. – willglynn

+2

맞습니다. 방금 확인했는데 S3 용 ObjectMetadata에서 Content-Type을 설정하는 것이 제 경우의 트릭입니다. 나는 여전히 질문에 대한 답을 알고 싶다. 미래에 도움이 될 수있는 것처럼 보인다. – rphutchinson

+1

충분합니다. 파일 확장자에는 MIME 형식 중 하나의 True Mapping ™이 없습니다. 여러 유형의 확장자가 있고 일부 확장자는 여러 유형이 있습니다. 따라서 두 가지를 독립적으로 유지할 수있는 데이터 저장소를 사용할 때 나는 알고있는 것만 저장하려고합니다. 추측을 삼가하십시오. – willglynn

답변

41

때 난 그냥 빈 문자열을 받고 있어요 무엇에서 Mimetypes와 파일 확장자 사이에 범용 1 : 1 매핑이 없습니다 ... 일부 MIME 유형은 가능한 하나 이상의 확장자를 가지며, 많은 확장자는 여러 MIME 유형과 공유되며 일부 MIME 유형은 확장자가 없습니다.

가능한 한 mimetype을 저장하고 그 기능을 계속 사용하는 것이 좋습니다. 확장 기능을 잊어 버리는 것이 좋습니다.

그렇다면 주어진 MIME 형식에 대해 가장 일반적인 파일 확장명을 얻으려면 Tika을 사용하는 것이 좋습니다. Apache Tika에는 알고있는 매우 큰 mimetyp 세트가 있으며 그 중 다수는 탐지, 일반 확장자, 설명 등의 MIME 마술도 알고 있습니다.

가장 일반적인 JPEG 파일 확장명을 얻으려면 다음을 수행하십시오. this Apache Tika unit test 같이 당신은 같은 것을 수행해야합니다

MimeTypes allTypes = MimeTypes.getDefaultMimeTypes(); 
    MimeType jpeg = allTypes.forName("image/jpeg"); 
    String jpegExt = jpeg.getExtension(); // .jpg 
    assertEquals(".jpg", jpeg.getExtension()); 

중요한 것은 당신이 모든 MIME 형식의 정의를 얻기 위해 티카 항아리에 번들 것 xml 파일을로드 할 필요가 있다는 것입니다. 사용자 정의 MIME 형식을 처리 할 수있는 경우도 다음 티카는 사람들을 지원하고, 변화 라인 하나가 될 다음 MIME 형식을 얻기 위해 TikaConfig 방법을 사용하여

TikaConfig config = TikaConfig.getDefaultConfig(); 
    MimeTypes allTypes = config.getMimeRepository(); 

는, 티카는 또한 사용자 정의 마임의되어 정의에 대한 귀하의 클래스 경로를 확인합니다, 그것도 포함합니다.

관련 문제