2009-07-16 11 views
5

Sto utilizzando un fileContentResult per eseguire il rendering di un file nel browser. Funziona bene tranne che genera un'eccezione quando il fileName contiene caratteri internazionali. Ricordo di aver letto da qualche parte che questa funzione non supporta i caratteri internazionali, ma sono sicuro che ci sia bisogno di una soluzione alternativa o di una best practice da seguire nei casi in cui l'applicazione debba caricare file in paesi diversi dagli Stati Uniti.FileContentResult e caratteri internazionali

Qualcuno sa di una tale pratica? Ecco il metodo 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); 
    } 

grazie in anticipo

Susan

risposta

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

Funziona anche quando ci sono caratteri internazionali in FileDownloadName? – RezaRahmati

+0

@rezarahmati Sfortunatamente no. Ma per i nomi di file internazionali è possibile utilizzare questo esempio: https://gist.github.com/AlexMAS/c874bc03bff8a2717e18 – AlexMAS

0

Non credo sia possibile scaricare i file con i caratteri internazionali in il nome del file. Il nome del file fa parte dell'intestazione Content-disposition e, come tutte le intestazioni HTTP, non è possibile utilizzare una codifica diversa dall'ASCII che funzioni su tutti i browser e i proxy.

Caricamento di file con caratteri internazionali dovrebbe essere un problema, però, dato che il nome del file viene trasmesso come normali dati del modulo (application/www-url-encoded)

+0

Lo so, ma l'ho provato su alcuni siti Web e funziona bene con i caratteri svedesi, quindi deve esserci una soluzione alternativa. Ad esempio, se alleghi un file a Gmail e lo scarichi anche se ha caratteri internazionali, funziona comunque bene. Una cosa che posso pensare è Allegare il file direttamente alla risposta, ma come posso inviarlo al client in MVC? – suzi167

+0

Puoi provare a decodificare come funziona Google e creare la tua classe derivata da ActionResult, in cui puoi restituire quello che vuoi (limitato da ciò che ASP.NET ti permette di fare). – 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; 
} 

I byte ottenuti da UTF-8 o Win1250 hanno dimensioni diverse. È necessario interpretare la stringa in modo corretto ottenendo byte dalla stringa nella codifica corretta.

Problemi correlati