4

这段代码

string xml = XmlHelper.ToXml(queryTemplate);

byte[] xmlb = StringHelper.GetBytes(xml);

var cd = new System.Net.Mime.ContentDisposition
{
    // for example foo.bak
    FileName = String.Format("{0}_v{1}.xml", queryModel.Name, queryModel.Version),

    // always prompt the user for downloading, set to true if you want
    // the browser to try to show the file inline
    Inline = false,
};
Response.AppendHeader("Content-Disposition", cd.ToString());
return File(xmlb, "application/xml");

转换成后发现字符串编码不正确byte[]

所以我需要string立即将其放入文件中,就像这样

FileStream xfile = new FileStream(Path.Combine(dldir, filename), FileMode.Create, System.IO.FileAccess.Write);
hssfwb.Write(xfile);

但我不想这样做,我不需要下载后的文件。我只需要将它作为文件下载返回到浏览器,并且不想在之后处理文件删除,当有很多请求时这会变得非常忙碌。

如何更正从stringto的字符编码byte[]并将其正确返回给浏览器?

GetBytes函数看起来像这样

public static byte[] GetBytes(string str)
{
    byte[] bytes = new byte[str.Length * sizeof(char)];
    System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
    return bytes;
}
4

3 回答 3

14

像这样的东西会起作用:

try
{
    Response.ContentType = "application/octet-stream"; 
    Response.AddHeader( "Content-Disposition", "attachment; filename=" + filename ); 
    Response.OutputStream.Write(xmlb, 0, xmlb.Length); 
    Response.Flush(); 
} 
catch(Exception ex) 
{
    // An error occurred.. 
}
于 2013-01-04T14:43:14.550 回答
1

在这种情况下:

public static byte[] GetBytes(string str)
{
    byte[] bytes = new byte[str.Length * sizeof(char)];
    System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
    return bytes;
}

您最终将使用 UTF-16LE 编码,因为这就是char数组内部的内容。

您应该摆脱该功能,因为它既具有误导性,又具有开箱即用的功能的冗余重复,因为System.Text.Encoding.Unicode.GetBytes已经做了同样的事情:使用 little endian byte order 的 UTF-16 格式的编码

如果在不指定编码的情况下创建临时文件,那么您可能需要 Windows-1252,因为在创建文件时很可能会隐式使用它:

Encoding enc = Encoding.GetEncoding(1252);
byte[] xmlb = enc.GetBytes(xml);

如果你想要 UTF-8,你会这样做:

byte[] xmlb = Encoding.UTF8.GetBytes(xml);
于 2013-01-06T12:06:18.213 回答
0

我已经有了答案,原来问题出在字符编码上。

解决方案链接如下

将字符串转换为 byte[] 创建零字符

于 2013-01-06T13:01:02.180 回答