확장자에 맞도록 MIME Type 설정하기

2023. 3. 26. 19:04프로그래밍

728x90

내가 알기로 이 타입은 예전에 전자우편에서 ASCII 코드 값 이상의 문자를 전송할 때 상대편으로 하여금 내가 보내는 문자의 타입을 알려주는 역할을 한 것으로 알고 있다.

요즘은 주로 HTTP 통신에서 인코딩 타입이나 혹은 문서 종류를 알려 줄 때 주로 사용한다고 한다.

물론, HTTP 헤더에도 그런 내용들이 들어가 있으며 대표적인 헤더가 Content-Type 이다.

그러면 다음은 받아 들인 파일 확장자를 찾아서 해당 MIME 타입에 매핑해 주는 메서드를 만들어 보기로 하자.

확장자들의 타입은 기본적으로 이미지와 엑셀 등 몇개 타입만 테스트 해보자

​확장자들의 타입들은 전역으로 해서 설정하도록 하자.

public static String EXT_DWG = "application/acad";
public static String EXT_PDF = "application/pdf";
public static String EXT_DJVU = "Image/x.djvu";
public static String EXT_EXCEL = "application/vnd.ms-excel";
public static String EXT_EXCELX = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
public static String EXT_PPT = "application/vnd.ms-powerpoint";
public static String EXT_PPTX = "application/vnd.openxmlformats-officedocument.presentationml.presentation";
public static String EXT_GIF = "image/gif";
public static String EXT_JPEG = "image/jpeg";
public static String EXT_JPG = "image/jpeg";
public static String EXT_PNG = "image/png";
public static String EXT_BMP = "image/bmp";
public static String EXT_DOC = "application/msword";
public static String EXT_DOCX = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
public static String EXT_HWP = "application/vnd.hancom.hwp";
 

자바에서 char 는 2바이트이므로 한글문자로 하나로 취급하게 되는 데 다음 문자열을 보자

▶ "15년 안드로이드 프로그래밍 안내 App. 개발.PPTX "
 

원래 48바이트 짜리 문자열이긴 하지만 전체 길이를 찍어 보면 33 이 된다.

위의 문자열에서 확장자 뒤에 공백 문자를 하나 더 넣었다.

자 그럼 이 문자열에서

 

  1. PPTX 라는 확장자를 뽑아내고,
  2. Trim으로 뒤에 공백문자를 제거하고,
  3. 모두 소문자로 변환해서 비교 한다음, 해당 MIME 타입에 매핑하는 메서드를
  4. 만들어 보기로 하자.

우선 PPTX 확장자를 뽑아내는 것은

1.해당 문자열을 getChars 메서드를 사용해서 char 배열을 뽑아 낸 다음
2.뒤에서 부터 '.' 가 나올 때 까지 읽고 난 offset 저장하고
3.​다시 String 클래스를 사용해서 확장자를 뽑아내도록 하는
 

​일련의 작업을 거쳐보기로 한다.

다음 코드와 같이 길이는 '\0' 문자를 포함하기 때문에 length() 메서드의 길이값 + 1 이 된다.

int len = name.length()+1;
 

​계산된 길을 사용해서 char 배열을 선언하고

char[] parseC = new char[len];
 

​그리고 getChars 메서드를 사용해서 문자열을 뽑아 낸다.

name.getChars(0, name.length(), parseC, 0);
 

​그리고 뒤에서 부터 읽어가면서 '.' 문자를 찾아내서 해당 offset을 저장한다.

int i = -1;
for(i = len-1;i != 0; i--)
{
   c = parseC[i];
   if(c == '.') break;
}
 

그러고 나서 원하는 확장자를 String 클래스를 사용해서 뽑아내도록 한다. 뽑아 내면서 Trim으로 뒤에 있는 공백을 동시에 제거하자.

extension = new String(parseC, i, len-i).trim();
 

결과값은

. position: 27
character: .
so extension is ==> .PPTX
 

​이 되겠다.

나머지 부분은 이를 toLowerCase 메서드로 소문자 비교를 하는 부분이다.

if(extension.toLowerCase().equals(".dwg"))
 

전체 소스 코드이다.

public static String getProperMimeType(final String name)
{
	String MimeType = "application/unknown";
	//dstbegin + (srcEnd-srcBegin) - 1
	String extension = EXT_EXCEL;

	int len = name.length()+1;
	System.out.println("Length : " + len);

	char[] parseC = new char[len];
	char c = '\0';
	name.getChars(0, name.length(), parseC, 0);
	int i = -1;
	for(i = len-1;i != 0; i--)
	{
		c = parseC[i];

		if(c == '.')
		break;
	}

	System.out.print(c);
	System.out.print("\t");
	System.out.println("position: " + i);
	System.out.println("character: " + parseC[i]);

	System.out.println("so extension is ==> " + new String(parseC, i, len-i));

	System.out.println();

	extension = new String(parseC, i, len-i).trim();

	if(extension.toLowerCase().equals(".dwg"))
	{
		MimeType = EXT_DWG;
	}
	else if(extension.toLowerCase().equals(".pdf"))
	{
		MimeType = EXT_PDF;
	}
	else if(extension.toLowerCase().equals(".djvu"))
	{
		MimeType = EXT_DJVU;
	}
	else if(extension.toLowerCase().equals(".xlsx"))
	{
		MimeType = EXT_EXCEL;
	}
	else if(extension.toLowerCase().equals(".xls"))
	{
		MimeType = EXT_EXCELX;
	}
	else if(extension.toLowerCase().equals(".ppt"))
	{
		MimeType = EXT_PPT;
	}
	else if(extension.toLowerCase().equals(".pptx"))
	{
		MimeType = EXT_PPTX;
	}
	else if(extension.toLowerCase().equals(".gif"))
	{
		MimeType = EXT_GIF;
	}
	else if(extension.toLowerCase().equals(".png"))
	{
		MimeType = EXT_PNG;
	}
	else if(extension.toLowerCase().equals(".bmp"))
	{
		MimeType = EXT_BMP;
	}
	else if(extension.toLowerCase().equals(".jpg"))
	{
		MimeType = EXT_JPG;
	}
	else if(extension.toLowerCase().equals(".jpeg"))
	{
		MimeType = EXT_JPEG;
	}
	else if(extension.toLowerCase().equals(".doc"))
	{
		MimeType = EXT_DOC;
	}
	else if(extension.toLowerCase().equals(".docx"))
	{
		MimeType = EXT_DOCX;
	}
	else
	{
		MimeType = EXT_EXCEL;
	}

	return MimeType;
}
 

이상.​

728x90