2009-07-16 19 views
5

Ben tarayıcıya bir dosyayı işlemek için bir fileContentResult kullanıyorum. FileName uluslararası karakterler içerdiğinde bir istisna atması dışında iyi çalışır. Bu özellik uluslararası karakterleri desteklemeyen ama bir çözüm ya da en iyi uygulama insanların uygulaması ABD dışındaki ülkelerde dosya yüklemek için gereken durumlarda orada izleyin mustbe eminim ki bir yerlerde okumuştum.FileContentResult ve uluslararası karakterler

? İşte peşin

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); 
    } 

THanks ActionResult Yöntem

kimse böyle bir uygulama biliyor mu olduğunu

Susan

cevap

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

Ayrıca FileDownloadName'de uluslararası chars olduğunda çalışır mı? – RezaRahmati

+0

@rezarahmati Ne yazık ki değil. Ancak uluslararası dosya adları için şu örneği kullanabilirsiniz: https://gist.github.com/AlexMAS/c874bc03bff8a2717e18 – AlexMAS

0

Ben uluslararası karakterler ile dosya indirmek mümkün olduğunu sanmıyorum dosya adı. Dosya adı Content-disposition başlığının parçasıdır ve tüm HTTP başlıklarını gibi tüm tarayıcılarda ve vekiller arasında çalışacak ASCII dışında farklı bir kodlama kullanmanın bir yolu yoktur. Dosya adı, normal form verilerini (application/www-url-encoded)

+0

Bunu biliyorum ama birkaç web sitelerinde denedim ve alternatif çözüm olmalıdır böylece İsveçli karakterleri ile iyi çalışır. Örneğin, gmail'e bir dosya eklerseniz ve uluslararası karakterlere sahip olsalar bile indirirseniz, yine de iyi çalışır. Düşünebildiğim bir şey, dosyayı doğrudan yanıta bağlamaktır, ancak MVC'de istemciye nasıl geri gönderebilirim? – suzi167

+0

Google bunu nasıl ters mühendislik ve kendi sınıf ne olursa olsun istediğiniz (ASP.NET yapmaya izin verir şey tarafından sınırlı) dönebilirsiniz ActionResult, türetilmiş oluşturmak için deneyebilirsiniz. – 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; 
} 

Bayt, UTF-8'den veya Win1250'nin farklı boyutlarına sahip olur. Doğru Kodlamada dizeden bytes elde ederek dizeyi doğru şekilde yorumlamalısınız.

İlgili konular