2009-10-21 8 views
16

Lorsque le nom de fichier est "Algasas MARCAS que nos acompañan", ASP.NET MVC déclenche un System.FormatException lorsque j'essaie de télécharger ce fichier. Mais si le nom de fichier est "Asistente de Gerencia Comercial", ce n'est pas le cas.Comment encoder un nom de fichier à télécharger?

Je suppose que c'est parce que quelque chose lié à l'encodage UTF-8, mais je ne sais pas comment encoder cette chaîne.

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

+0

Comment êtes-vous d'envoyer le fichier à l'utilisateur maintenant? En utilisant 'System.Web.Mvc.FileResult'? Pouvez-vous envoyer votre code? –

+0

Oui, j'utilise FileResult. – eKek0

+0

La chose étrange est que 'System.Web.Mvc.FileResult' utilise en interne' System.Net.Mime.ContentDisposition' pour générer l'en-tête qu'il ajoute à la réponse. Je m'attendais à ce que cette classe soit capable de gérer n'importe quel encodage de chaîne est nécessaire pour faire ce travail. –

Répondre

22

J'encode 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)); 
+3

Cela remplace les espaces avec +, ce qui peut ne pas être ce que vous voulez. – Cosmin

+2

** NOTE **: Pour la solution correcte dans les temps modernes, voir RFC6266: http://tools.ietf.org/html/rfc6266 –

5

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

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

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

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

Ce problème est connu depuis des années. Pour autant que je sache, il n'existe actuellement aucun moyen interopérable de faire cela, donc la réponse est de ne prendre en charge qu'un seul ensemble de navigateurs, ou de faire un reniflage de l'agent utilisateur.

cas de test et des liens à: http://greenbytes.de/tech/tc2231/

0

Notez que l'utilisation de codage UTF remplace les espaces dans le nom du fichier dans « + », en utilisant les codes suivants produisent les mêmes résultats:

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

au lieu d'utiliser httpUtility qui remplace les espaces dans le nom de fichier avec « + » en utilisant le code suivant résoudre le problème:

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

s'il vous plaît noter que si vous récupérez le nom de fichier que vous définissez les données peut-être besoin de couper le nom d'abord! vous devez ajouter également les lignes de code suivantes à l'avance:

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