Je sais que c'est un vieux post mais il est toujours très pertinentes. J'ai trouvé que les navigateurs modernes soutien rfc5987, qui permet l'encodage utf-8, le pourcentage codé (url-encodé). Puis Naïf file.txt devient:
Content-Disposition: attachment; filename*=UTF-8''Na%C3%AFve%20file.txt
Safari (5) n'a pas de soutiens et vous, au lieu d'utiliser le Safari standard de l'écriture du nom de fichier directement dans votre codé en utf-8 en-tête:
Content-Disposition: attachment; filename=Naïve file.txt
IE8 et plus ne le supporte pas non plus, et vous devez utiliser l'IE niveau de l'encodage utf-8, le pourcentage codé:
Content-Disposition: attachment; filename=Na%C3%AFve%20file.txt
Dans ASP.Net j'utilise le code suivant:
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);
J'ai testé le ci-dessus en utilisant IE7, IE8, IE9, Chrome 13, Opera 11, FF5, Safari 5.
Mise À Jour De Novembre 2013:
Voici le code que j'utilise actuellement. J'ai encore à l'appui de IE8, donc je ne peut pas se débarrasser de la première partie. Il s'avère que les navigateurs sur Android utiliser le construit en Android gestionnaire de téléchargement et il ne peut pas analyser de manière fiable les noms de fichier de façon standard.
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);
Le ci-dessus est maintenant testé dans IE7-11, Chrome 32, Opera 12, FF25, Safari 6, en utilisant le nom du fichier à télécharger: 你好abcABCæøåÆØÅäöüïëêîâéíáóúýñ½§!#¤%&()=`@£$€{[]}+^~'-_,;.txt
Sur IE7 ça marche pour certains personnages, mais pas tous. Mais qui se soucie de IE7 aujourd'hui?
C'est la fonction que j'utilise pour générer sûr les noms de fichiers pour Android. Notez que je ne sais pas quels sont les caractères pris en charge sur Android, mais que j'ai testé que ces travaux pour assurer:
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: je l'ai testé dans IE7 et IE8 et il s'est avéré que je n'ai pas besoin d'échapper l'apostrophe ('). Avez-vous un exemple où il échoue?
@Dave Van den Eynde: la Combinaison de deux noms de fichier sur une ligne selon RFC6266 fonctionne sauf pour Android et IE7+8 et j'ai mis à jour le code pour tenir compte de cela. Merci pour la suggestion.
@Thilo: Aucune idée sur GoodReader ou tout autre navigateur. Vous pourriez avoir de la chance en utilisant le Android approche.