sitelink1 | |
---|---|
sitelink2 | |
sitelink3 | |
sitelink4 | |
sitelink5 | |
sitelink6 |
이것은 자바 팁이라기보다는 마이크로소프트 사의 인터넷 익스플로러 사용 팁이라고 봐야겠네요.
파일 다운로드할 때 인터넷 익스플로러가 자동으로 다운로드 대화상자를 띄우도록 하려면 Content-Disposition HTTP 헤더를 사용하면 된다는 것이 많이 알려져 있는 것 같습니다.
이 경우
Content-Disposition: attachment; filename=myfile.txt;
뭐 이런 식으로 처리하면 되는데 문제는 파일 이름이 myfile.txt가 아니라 현재의 인코딩(한글 윈도우라면 자바의 MS949)에서 표현할 수 없는 글자일 경우입니다.
다음 URL에서 실용적인 해법을 제시하고 있습니다. 실제 표준이라고 보기에는 아직 무리가 있습니다. 아직 unicode 파일 이름을 이 헤더에서 처리하는 표준은 명확하지 않은 것 같습니다.
* Problem in downloading a pdf file having Japanese characters in the name of the file
이 내용과 관련된 RFC는
* MIME (Multipurpose Internet Mail Extensions) Part Three: Message Header Extensions for Non-ASCII Text2407
입니다.
그런데 이렇게 처리하면 UTF8로 escape되면서 너무 길어지게 되는데 IE가 헤더 길이에 한계를 두고 있어서 긴 파일 이름은 잘못 보여줄 수 있답니다.
그래서 항상 이 방법을 사용하기보다는 현재 인코딩으로 못 보여주는 유니코드 글자가 있는지 검사를 해서 그 경우에만 이 방법을 쓰는 게 좋겠습니다.
다음은 테스트를 위한 서블릿 부분 코드로, tomcat 5.0에 input/output 인코딩 모두를 ISO-8859-1로 가정하고 있습니다.
input/output 인코딩이 MS949나 EUC-KR인 경우에는 약간 수정이 필요할 것입니다.
이 방식을 사용하면 한글 윈도우에서 MS949 밖의 일본어나 중국어 글자를 가진 파일 이름도 인터넷 익스플로러 다운로드 대화상자에서 표현할 수가 있습니다.
// 사용 인코딩을 MS949로 생각하고 상수 선언합니다.
private static final String MY_ENCODING = "MS949";
... (생략)
{
... (생략)
String fileName = request.getParameter("fileName");
// 1바이트짜리라고 생각하고 톰캣이 읽어들인 것을 UTF8로 바로 잡습니다.
// 실제 IE가 UTF8로 post해야 하겠지요.
fileName = new String(fileName.getBytes("8859_1"), "UTF8");
String agentType = request.getHeader("User-Agent");
response.setContentType("application/octet-stream;");
// 톰캣이 이해할 수 있는 RESPONSE HEADER로 바꿔주기 위해 MS949에 따른 바이트
// 배열로 바꾸고 이것을 다시 1바이트짜리 String인 ISO-8859-1 인코딩으로
// 해서 String 객체를 다시 만듭니다. 만약 MS949를 기본 인코딩으로 인식하는
// 환경이라면 그냥 문자열을 사용하면 되겠지요.
// String header = "attachment; filename=" + fileName + ";";
String header = "attachment; filename=" + new
String(fileName.getBytes(MY_ENCODING), "8859_1") + ";";
// 현재 인코딩으로 다 표현할 수 있는지 여부를 검사해서, 다 표현할 수 없을
// 경우에만 RFC 2047에서 정의한 것과 유사한 방식으로 escape을 합니다.
if (!fileName.equals(new String(fileName.getBytes(MY_ENCODING),
MY_ENCODING))) {
header = "=?UTF-8?Q?attachment; filename="
+ java.net.URLEncoder.encode(fileName, "UTF-8") + ";?=";
}
response.setHeader("Content-Disposition", header);
}
파일 다운로드할 때 인터넷 익스플로러가 자동으로 다운로드 대화상자를 띄우도록 하려면 Content-Disposition HTTP 헤더를 사용하면 된다는 것이 많이 알려져 있는 것 같습니다.
이 경우
Content-Disposition: attachment; filename=myfile.txt;
뭐 이런 식으로 처리하면 되는데 문제는 파일 이름이 myfile.txt가 아니라 현재의 인코딩(한글 윈도우라면 자바의 MS949)에서 표현할 수 없는 글자일 경우입니다.
다음 URL에서 실용적인 해법을 제시하고 있습니다. 실제 표준이라고 보기에는 아직 무리가 있습니다. 아직 unicode 파일 이름을 이 헤더에서 처리하는 표준은 명확하지 않은 것 같습니다.
* Problem in downloading a pdf file having Japanese characters in the name of the file
이 내용과 관련된 RFC는
* MIME (Multipurpose Internet Mail Extensions) Part Three: Message Header Extensions for Non-ASCII Text2407
입니다.
그런데 이렇게 처리하면 UTF8로 escape되면서 너무 길어지게 되는데 IE가 헤더 길이에 한계를 두고 있어서 긴 파일 이름은 잘못 보여줄 수 있답니다.
그래서 항상 이 방법을 사용하기보다는 현재 인코딩으로 못 보여주는 유니코드 글자가 있는지 검사를 해서 그 경우에만 이 방법을 쓰는 게 좋겠습니다.
다음은 테스트를 위한 서블릿 부분 코드로, tomcat 5.0에 input/output 인코딩 모두를 ISO-8859-1로 가정하고 있습니다.
input/output 인코딩이 MS949나 EUC-KR인 경우에는 약간 수정이 필요할 것입니다.
이 방식을 사용하면 한글 윈도우에서 MS949 밖의 일본어나 중국어 글자를 가진 파일 이름도 인터넷 익스플로러 다운로드 대화상자에서 표현할 수가 있습니다.
// 사용 인코딩을 MS949로 생각하고 상수 선언합니다.
private static final String MY_ENCODING = "MS949";
... (생략)
{
... (생략)
String fileName = request.getParameter("fileName");
// 1바이트짜리라고 생각하고 톰캣이 읽어들인 것을 UTF8로 바로 잡습니다.
// 실제 IE가 UTF8로 post해야 하겠지요.
fileName = new String(fileName.getBytes("8859_1"), "UTF8");
String agentType = request.getHeader("User-Agent");
response.setContentType("application/octet-stream;");
// 톰캣이 이해할 수 있는 RESPONSE HEADER로 바꿔주기 위해 MS949에 따른 바이트
// 배열로 바꾸고 이것을 다시 1바이트짜리 String인 ISO-8859-1 인코딩으로
// 해서 String 객체를 다시 만듭니다. 만약 MS949를 기본 인코딩으로 인식하는
// 환경이라면 그냥 문자열을 사용하면 되겠지요.
// String header = "attachment; filename=" + fileName + ";";
String header = "attachment; filename=" + new
String(fileName.getBytes(MY_ENCODING), "8859_1") + ";";
// 현재 인코딩으로 다 표현할 수 있는지 여부를 검사해서, 다 표현할 수 없을
// 경우에만 RFC 2047에서 정의한 것과 유사한 방식으로 escape을 합니다.
if (!fileName.equals(new String(fileName.getBytes(MY_ENCODING),
MY_ENCODING))) {
header = "=?UTF-8?Q?attachment; filename="
+ java.net.URLEncoder.encode(fileName, "UTF-8") + ";?=";
}
response.setHeader("Content-Disposition", header);
}