2009-10-21 19 views
16

Cuando el nombre del archivo es "Algunas MARCAS que nos acompañan" ASP.NET MVC levanta un System.FormatException cuando intento descargar ese archivo. Pero si el nombre del archivo es "Asistente de Gerencia Comercial", no es así.¿Cómo codifico un nombre de archivo para descargar?

Supongo que esto se debe a algo relacionado con la codificación UTF-8, pero no sé cómo codificar esa cadena.

Si estoy en lo cierto, ¿cómo puedo codificar la cadena en la codificación UTF-8? Si no estoy en lo cierto, ¿cuál es mi problema?

+0

¿Cómo estás enviando el archivo de nuevo al usuario ahora? ¿Usando 'System.Web.Mvc.FileResult'? ¿Puedes publicar tu código? –

+0

Sí, estoy usando FileResult. – eKek0

+0

Lo extraño es que 'System.Web.Mvc.FileResult' utiliza internamente' System.Net.Mime.ContentDisposition' para generar el encabezado que agrega a la respuesta. Hubiera esperado que esa clase pudiera manejar cualquier codificación de cadena necesaria para que esto funcione. –

Respuesta

22

que codifican nombre de archivo como esto para la descarga,

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

Esto reemplaza los espacios con +, que pueden no ser lo que quieres. – Cosmin

+2

** NOTA **: Para la solución correcta en tiempos modernos, vea RFC6266: http://tools.ietf.org/html/rfc6266 –

5

Basado en respuesta ZZ Coder, y porque estoy usando FileResult, me decidieron a codificar el nombre de archivo como:

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

Hace poco luché con esto un poco, con muchos idiomas potenciales que se utilizan para los nombres de los archivos (es bueno probarlos en chino). Aquí hay algo parecido a lo que terminé (otros detalles de implementación excluidos):

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

Este problema se conoce desde hace años. Por lo que puedo decir, actualmente no hay una forma interoperable de hacerlo, por lo que la respuesta es solo admitir un conjunto de navegadores o hacer un sniffing de User Agent.

casos de prueba y enlaces: http://greenbytes.de/tech/tc2231/

0

nota que el uso de la codificación UTF reemplaza los espacios en el nombre de archivo en '+', utilizando los siguientes códigos producen los mismos resultados:

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

en lugar de utilizar httpUtility que reemplaza los espacios en el nombre del archivo con "+" usando el siguiente código resuelve el problema:

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

tenga en cuenta que si recupera el nombre del archivo de datos que establecen puede ser necesario recortar el nombre primero! hay que añadir también las siguientes líneas de código con antelación:

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