ASP 학습
| 파일 다운로드 프로그램 작성시 한글파일명이 깨지는 것에 대해서 |
이것이 정답인지 아닌지는 저도 확신할 수 없지만 어느정도 신뢰할만하다고 생각합니다. 해보시고 답글 부탁드립니다.
기존에 나와 있는 방법중 신뢰할 만한 방법은 Web.config 부분에 다음과 같이 씁니다.
<globalization requestEncoding="utf-8" responseEncoding="utf-8" />
파일 다운로드 부분의 코딩에 ( FileDown.aspx )
Response.ClearHeaders()
Response.AddHeader("Content-Type", "application/unknown")
Response.AddHeader("Content-Disposition","attachment;filename="+Server.UrlEncode(Path.GetFileName(selectedItemName)).Replace("+","%20"))
Response.ContentType = "multipart/form-data"
Response.WriteFile(selectedItemName)
''''
같이 쓰며 Response.CharSet("포멧") 과 같은 부분은 안써 주셔도 됩니다.
이때 주의 하실점이 있습니다.
자신의 파일 다운로드 하는 코딩이 들어가 있는 페이지(FileDown.aspx) 의 document 의 charset 부분의 속성과
cordPage 속성, culture 부분의 속성에 아무것도 없어야 합니다.
만약 속성이 정의 되어 있으면(예: 한국어) 여지 없이 한글파일명이 깨져서 출력되게 됩니다.
저도 처음 이 방법을 쓰다가 필요성에 의해서 다음과 같이 바뀌었습니다.
아시다시피 AAAA.aspx?AAA=우리나라 라고 페이지를 직접 호출하게 될때 AAAA.aspx 부분에서
Request.QueryString("AAA") 를 하게 되면 "우리나라" 라는 글자 대신에 이상한 ㅁ??ㄹㅇ ??f 같은 글자들이 깨져서 나옵니다.
UTF-8 부분과의 문제인데 이걸 해결 하기 위해서
Web.config 부분을 다음과 같이 바꾸어 주었습니다.
<globalization requestEncoding="ks_c_5601-1987" responseEncoding="ks_c_5601-1987" />
이때 파일 다운로드 코딩 부분이 위와 동일 하다면 한글파일을 다운로드 하시게 되면 다시한번 여지 없이 한글파일들이
깨지게 됩니다. 이때가 가장 좌절을 많이 느끼게 되는 때입니다.
그래서 Response.CharSet("ks_c_5601-1987" ) 을 써주었지만 마찬가지 였습니다.
이럴때는 다음과 같이 수정하여서 해결 하였습니다.
Response.ClearHeaders()
Response.AddHeader("Content-Type", "application/unknown")
Response.AddHeader("Content-Disposition","attachment; filename="+ HttpUtility.UrlEncode(Path.GetFileName(selectedItemName)).Replace("+","%20"))
Response.ContentType = "multipart/form-data"
Response.WriteFile(selectedItemName)
보시다시피 Server.UrlEncode 부분이 HttpUtility.UrlEncode 부분으로 변경되었습니다.
왜 그런지 이유는 사실 잘 모릅니다. 삽질에 삽질 끝에 그렇게 하니 되더군여.
결론은
1. Document 의 charset 속성과 cordPage 속성, culture 속성 에는 아무것도 지정하지 않았으며,
2. Web.Config 부분에는
<globalization requestEncoding="utf-8" responseEncoding="utf-8" />
파일다운로드 부분에는 (FileDown.aspx)
Response.ClearHeaders()
Response.AddHeader("Content-Type", "application/unknown")
Response.AddHeader("Content-Disposition","attachment;filename="+Server.UrlEncode(Path.GetFileName(selectedItemName)).Replace("+","%20"))
Response.ContentType = "multipart/form-data"
Response.WriteFile(selectedItemName)
또는
3. Web.Config 부분이 아래와 같이 변경된다면
<globalization requestEncoding="ks_c_5601-1987" responseEncoding="ks_c_5601-1987" />
파일다운로드 부분은 (FileDown.aspx)
Response.ClearHeaders()
Response.AddHeader("Content-Type", "application/unknown")
Response.AddHeader("Content-Disposition","attachment;filename="+HttpUtility.UrlEncode(Path.GetFileName(selectedItemName)).Replace("+","%20"))
Response.ContentType = "multipart/form-data"
Response.WriteFile(selectedItemName)
그럼 많은 도움 되셨으면 합니다. -鍾世-

