나는 이것이 오래된 게시물이라는 것을 알고 있지만 여전히 관련이 있습니다. 현대 브라우저는 rfc5987을 지원하며 utf-8 인코딩, 백분율 인코딩 (URL 인코딩)을 허용합니다. 그런 다음 Naïve file.txt는 다음과 같습니다.
Content-Disposition: attachment; filename*=UTF-8''Na%C3%AFve%20file.txt
Safari (5)는이를 지원하지 않습니다. 대신 utf-8로 인코딩 된 헤더에 파일 이름을 직접 쓰는 Safari 표준을 사용해야합니다.
Content-Disposition: attachment; filename=Naïve file.txt
IE8 및 그 이전 버전도 지원하지 않으며 utf-8 인코딩의 IE 표준, 백분율 인코딩을 사용해야합니다.
Content-Disposition: attachment; filename=Na%C3%AFve%20file.txt
ASP.Net에서는 다음 코드를 사용합니다.
string contentDisposition;
if (Request.Browser.Browser == "IE" && (Request.Browser.Version == "7.0" || Request.Browser.Version == "8.0"))
contentDisposition = "attachment; filename=" + Uri.EscapeDataString(fileName);
else if (Request.Browser.Browser == "Safari")
contentDisposition = "attachment; filename=" + fileName;
else
contentDisposition = "attachment; filename*=UTF-8''" + Uri.EscapeDataString(fileName);
Response.AddHeader("Content-Disposition", contentDisposition);
IE7, IE8, IE9, Chrome 13, Opera 11, FF5, Safari 5를 사용하여 위의 테스트를 수행했습니다.
2013 년 11 월 업데이트 :
현재 사용중인 코드는 다음과 같습니다. 여전히 IE8을 지원해야하므로 첫 번째 부분을 제거 할 수 없습니다. Android의 브라우저는 내장 된 Android 다운로드 관리자를 사용하며 표준 방식으로 파일 이름을 안정적으로 구문 분석 할 수 없습니다.
string contentDisposition;
if (Request.Browser.Browser == "IE" && (Request.Browser.Version == "7.0" || Request.Browser.Version == "8.0"))
contentDisposition = "attachment; filename=" + Uri.EscapeDataString(fileName);
else if (Request.UserAgent != null && Request.UserAgent.ToLowerInvariant().Contains("android")) // android built-in download manager (all browsers on android)
contentDisposition = "attachment; filename=\"" + MakeAndroidSafeFileName(fileName) + "\"";
else
contentDisposition = "attachment; filename=\"" + fileName + "\"; filename*=UTF-8''" + Uri.EscapeDataString(fileName);
Response.AddHeader("Content-Disposition", contentDisposition);
위의 파일은 다음 파일 이름을 사용하여 IE7-11, Chrome 32, Opera 12, FF25, Safari 6에서 테스트되었습니다. 你好 abcABCæøåÆØÅäöüïëêîâéíáóúýñ½§ !! ^ ~ '-_,;. txt
IE7에서는 일부 문자에서 작동하지만 일부 문자에서는 작동하지 않습니다. 그러나 오늘날 누가 IE7에 관심이 있습니까?
이것은 Android의 안전한 파일 이름을 생성하는 데 사용하는 기능입니다. Android에서 지원되는 문자를 모르지만 이러한 문자가 제대로 작동하는지 테스트했습니다.
private static readonly Dictionary<char, char> AndroidAllowedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ._-+,@£$€!½§~'=()[]{}0123456789".ToDictionary(c => c);
private string MakeAndroidSafeFileName(string fileName)
{
char[] newFileName = fileName.ToCharArray();
for (int i = 0; i < newFileName.Length; i++)
{
if (!AndroidAllowedChars.ContainsKey(newFileName[i]))
newFileName[i] = '_';
}
return new string(newFileName);
}
@TomZ : IE7과 IE8에서 테스트했으며 아포스트로피 ( ')를 벗어날 필요가 없다는 것이 밝혀졌습니다. 실패한 예가 있습니까?
@Dave Van den Eynde : RFC6266에 따라 두 줄의 파일 이름을 한 줄에 결합하면 Android 및 IE7 + 8을 제외하고 작동하며 코드를 업데이트했습니다. 제안 해 주셔서 감사합니다.
@Thilo : GoodReader 또는 다른 비 브라우저에 대해서는 전혀 모른다. 안드로이드 접근법을 사용하면 운이 좋을 수도 있습니다.
@ Alex Zhukovskiy : 왜 그런지는 모르겠지만 Connect 에서 논의한 것처럼 끔찍하게 작동하지 않는 것 같습니다.