2009-07-16 7 views
5

J'utilise un fichierContentResult pour rendre un fichier au navigateur. Cela fonctionne bien sauf qu'il déclenche une exception lorsque le nomFichier contient des caractères internationaux. Je me souviens avoir lu quelque part que cette fonctionnalité ne prend pas en charge les caractères internationaux, mais je suis sûr qu'il doit y avoir une solution de contournement ou une bonne pratique que les gens suivent lorsque l'application a besoin de télécharger des fichiers dans d'autres pays.FileContentResult et caractères internationaux

Est-ce que quelqu'un sait d'une telle pratique? Voici la méthode 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); 
    } 

Mercis à l'avance

Susan

Répondre

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

Cela fonctionne-t-il quand il y a des caractères internationaux dans FileDownloadName aussi? – RezaRahmati

+0

@rezarahmati Malheureusement pas. Mais pour les noms de fichiers internationaux, vous pouvez utiliser cet exemple: https://gist.github.com/AlexMAS/c874bc03bff8a2717e18 – AlexMAS

0

Je ne pense pas qu'il soit possible de télécharger des fichiers avec des caractères internationaux dans le nom du fichier. Le nom de fichier fait partie de l'en-tête Content-disposition et, comme tous les en-têtes HTTP, il n'existe aucun moyen d'utiliser un codage différent de l'ASCII qui fonctionne avec tous les navigateurs et tous les proxys.

fichiers Télécharger des avec des caractères internationaux devrait poser aucun problème, cependant, puisque le nom de fichier est transmis sous forme de données de forme normale (application/www-url-encoded)

+0

Je le sais mais je l'ai essayé sur quelques sites et ça fonctionne bien avec les caractères suédois donc il doit y avoir une solution alternative. Par exemple, si vous attachez un fichier à Gmail et que vous le téléchargez même s'il contient des caractères internationaux, cela fonctionne toujours bien. Une chose que je peux penser est de joindre le fichier directement à la réponse, mais alors comment puis-je le renvoyer au client dans MVC? – suzi167

+0

Vous pouvez essayer de désosser comment Google le fait et créer votre propre classe dérivée d'ActionResult, où vous pouvez retourner ce que vous voulez (limité par ce que ASP.NET vous permet de faire). – 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; 
} 

Les octets obtenus à partir de UTF-8 ou Win1250 ont une taille différente. Vous devez interpréter correctement la chaîne en obtenant des octets de la chaîne dans l'encodage de droite.

Questions connexes