Comment encoder un nom de fichier pour le téléchargement?

Lorsque le nom du fichier est “Algunas MARCAS que nos comptes”, ASP.NET MVC System.FormatException une System.FormatException lorsque je tente de télécharger ce fichier. Mais si le nom du fichier est “Asistente de Gerencia Comercial”, ce n’est pas le cas.

J’imagine que c’est parce que quelque chose est lié au UTF-8 , mais je ne sais pas comment coder cette chaîne.

Si j’ai raison, comment puis-je encoder la chaîne au UTF-8 ? Si je ne me trompe pas, quel est mon problème?

J’encode un nom de fichier comme celui-ci pour le téléchargement,

 HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename= " + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)); 

Basé sur la réponse de ZZ Coder, et parce que j’utilise FileResult, j’ai décidé de coder le nom du fichier en tant que:

 HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8) 

Ce problème est connu depuis des années. Autant que je sache, il n’existe actuellement aucun moyen interopérable de le faire. La solution consiste donc à ne prendre en charge qu’un seul ensemble de navigateurs, ou à effectuer un reniflement d’agent d’utilisateur.

Cas de test et liens sur: http://greenbytes.de/tech/tc2231/

Aussi: HttpUtility considéré comme nuisible:
http://serialseb.blogspot.com/2008/03/httputilityurlencode-considered-harmful.html

Je vais juste cogner et remplacer “” par “_” et l’appeler un jour =)

Je me suis récemment battu un peu avec cela, ayant beaucoup de langues potentielles utilisées pour les noms de fichiers (le chinois est bon à tester). Voici quelque chose proche de ce que j’ai fini avec (autres détails de mise en œuvre exclus):

 HttpUtility.UrlEncode("é", System.Text.Encoding.GetEncoding("ISO-8859-1")) 

notez que l’utilisation du codage UTF remplace les espaces du nom de fichier par un «+». L’utilisation des codes suivants produit les mêmes résultats:

 HttpUtility.UrlEncode("é", System.Text.Encoding.GetEncoding("ISO-8859-1")) HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8) 

au lieu d’utiliser httpUtility, qui remplace les espaces dans le nom du fichier par “+” à l’aide du code suivant, résolvez le problème:

 ssortingng attachment = Ssortingng.Format("attachment; filename={0}",Server.UrlPathEncode(file.Name.TrimEnd())); Response.AddHeader("Content-Disposition", attachment); 

Veuillez noter que si vous récupérez le nom de fichier à partir d’un jeu de données, vous devrez peut-être d’abord sortinger le nom! vous devez également append les lignes de code suivantes à l’avance:

 Response.Charset = "utf-8"; Response.HeaderEncoding = UnicodeEncoding.UTF8; Response.ContentEncoding = UnicodeEncoding.UTF8;