내가 알기로 이 타입은 예전에 전자우편에서 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 이 된다.
위의 문자열에서 확장자 뒤에 공백 문자를 하나 더 넣었다.
자 그럼 이 문자열에서
- PPTX 라는 확장자를 뽑아내고,
- Trim으로 뒤에 공백문자를 제거하고,
- 모두 소문자로 변환해서 비교 한다음, 해당 MIME 타입에 매핑하는 메서드를
- 만들어 보기로 하자.
우선 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;
}
이상.
'프로그래밍' 카테고리의 다른 글
[C#] 헥사 문자열을 Int 로 변환 (2) | 2023.03.29 |
---|---|
[C#] 자바의 instance of 와 같은 비교 (0) | 2023.03.27 |
[C#]ArcGIS 출력물 만들기 (0) | 2023.03.24 |
[C#] 자바의 instance of 와 같은 (0) | 2023.03.23 |
Sqlite 프로그래밍(C/C++/Java) (0) | 2023.03.22 |