FileContentResult和国际字符

时间:2009-07-16 18:13:35

标签: asp.net-mvc

我正在使用fileContentResult将文件呈现给浏览器。除了在fileName包含国际字符时抛出异常,它才能正常工作。 我记得在某个地方读过这个功能不支持国际字符,但我确信在应用程序需要在美国以外的国家上传文件的情况下,必须有一个解决方法或最佳实践。

有没有人知道这种做法?这是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);
    }  

提前谢谢

苏珊

4 个答案:

答案 0 :(得分: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; }
}

答案 1 :(得分:1)

我认为不可能在文件名中下载带有国际字符的文件。文件名是Content-disposition标头的一部分,与所有HTTP标头一样,除了ASCII之外,没有办法在所有浏览器和代理中使用不同的编码。

上传带有国际字符的文件应该没问题,因为文件名是作为普通表单数据传输的(application/www-url-encoded

答案 2 :(得分:0)

我认为这取决于您的responseHeaderEncoding(请参阅http://msdn.microsoft.com/en-us/library/hy4kkhe0.aspx

HTH,

埃里克

答案 3 :(得分: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;
}

来自UTF-8或Win1250的字节大小不同。您必须通过右侧编码从字符串中获取字节来正确解释字符串。