此代码
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);
但我不想这样做,下载后我不需要该文件。我只需要将它作为文件下载返回到浏览器,并且不希望以后处理文件删除,当有大量请求时它会变得非常繁忙。
如何更正从string
到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;
}
答案 0 :(得分: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..
}
答案 1 :(得分: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
已经做了同样的事情:使用UTF-16格式的编码小端字节顺序。
如果在未指定编码的情况下创建临时文件,则可能需要Windows-1252,因为在创建文件时很可能会隐式使用它:
Encoding enc = Encoding.GetEncoding(1252);
byte[] xmlb = enc.GetBytes(xml);
如果你想要UTF-8,你会这样做:
byte[] xmlb = Encoding.UTF8.GetBytes(xml);
答案 2 :(得分:0)