2009-07-16 15 views
5

Estoy usando un fileContentResult para procesar un archivo en el navegador. Funciona bien, excepto que arroja una excepción cuando el nombre de archivo contiene caracteres internacionales. Recuerdo haber leído en alguna parte que esta característica no es compatible con caracteres internacionales, pero estoy seguro de que debe haber una solución o una práctica recomendada que las personas sigan en los casos en que la aplicación necesite cargar archivos en otros países.FileContentResult y caracteres internacionales

¿Alguien sabe de tal práctica, aquí es el método ActionResult

public ActionResult GetFile(byte[] value, string fileName) 
    { 
     string fileExtension = Path.GetExtension(fileName); 
     string contentType = GetContentType(fileExtension); //gets the content Type 
     return File(value, contentType, fileName); 
    } 

Gracias de antemano

Susan

Respuesta

6
public class UnicodeFileContentResult : ActionResult { 

    public UnicodeFileContentResult(byte[] fileContents, string contentType) { 
     if (fileContents == null || string.IsNullOrEmpty(contentType)) { 
      throw new ArgumentNullException(); 
     } 

     FileContents = fileContents; 
     ContentType = contentType; 
    } 

    public override void ExecuteResult(ControllerContext context) { 
     var encoding = UnicodeEncoding.UTF8; 
     var request = context.HttpContext.Request; 
     var response = context.HttpContext.Response; 

     response.Clear(); 
     response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", (request.Browser.Browser == "IE") ? HttpUtility.UrlEncode(FileDownloadName, encoding) : FileDownloadName)); 
     response.ContentType = ContentType; 
     response.Charset = encoding.WebName; 
     response.HeaderEncoding = encoding; 
     response.ContentEncoding = encoding; 
     response.BinaryWrite(FileContents); 
     response.End(); 
    } 

    public byte[] FileContents { get; private set; } 

    public string ContentType { get; private set; } 

    public string FileDownloadName { get; set; } 
} 
+0

¿Funciona cuando hay caracteres internacionales en FileDownloadName también? – RezaRahmati

+0

@rezarahmati Desafortunadamente no. Pero para nombres de archivos internacionales puede usar este ejemplo: https://gist.github.com/AlexMAS/c874bc03bff8a2717e18 – AlexMAS

0

No creo que es posible descargar archivos con caracteres internacionales en el nombre del archivo. El nombre del archivo es parte del encabezado Content-disposition, y como todos los encabezados HTTP, no hay forma de utilizar una codificación diferente a ASCII que funcione en todos los navegadores y servidores proxy.

Carga de archivos con caracteres internacionales debería haber ningún problema, sin embargo, ya que el nombre del archivo se transmite como datos en forma normal (application/www-url-encoded)

+0

Lo sé, pero lo probé en algunos sitios web y funciona bien con caracteres suecos, por lo que debe haber una solución alternativa. Por ejemplo, si adjuntas un archivo a Gmail y lo descargas, incluso si tiene caracteres internacionales, sigue funcionando bien. Una cosa que puedo pensar es adjuntar el archivo directamente a la respuesta, pero ¿cómo lo enviaría de vuelta al cliente en MVC? – suzi167

+0

Puede intentar realizar una ingeniería inversa de cómo Google lo hace y crear su propia clase derivada de ActionResult, donde puede devolver lo que desee (limitado por lo que ASP.NET le permite hacer). – chris166

0
public FileContentResult XmlInvoice(Order order) 
{ 
    string stream = order.Win1250StringData; 
    var bytes = Encoding.GetEncoding("windows-1250").GetBytes(stream); 
    var fr = new FileContentResult(bytes, "application/xml"); 
    fr.FileDownloadName = string.Format("FV{0}.xml", order.DocumentNumber); 
    return fr; 
} 

Los bytes provienen de UTF-8 o Win1250 tienen un tamaño diferente. Debe interpretar la cadena de manera correcta al obtener bytes de la cadena en la codificación correcta.

Cuestiones relacionadas