我正在动态生成CSV数据导出.我这样做是通过获取项的哈希集,然后逐行转换它们并将它们写入MemoryStream,然后将其作为FileResult发送到客户端.问题是文件末尾有大约一百万个NULL字符,我猜这些字符的数量等于hashset中的项目数.但它们位于文件的末尾,而不是每行的结尾.
无论如何,代码是这样的:
Controller方法:
public ActionResult ExportList(ListExportModel model)
{
System.IO.MemoryStream ms = ls.ExportListToCsv(model,Server.MapPath("~/uploads"));
return File(ms.GetBuffer(),"text/csv",model.MailingList.ListName + ".csv");
}
Run Code Online (Sandbox Code Playgroud)
ExportListToCsv方法
public MemoryStream ExportListToCsv(ListExportModel model, string folderpath)
{
MemoryStream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream);
writer.WriteLine(string.Join(",", model.Columns));
var data = GetListItemsFromCsv(model.ListId, folderpath);
XmlDocument doc = new XmlDocument();
// Parallel.ForEach(data, (li) =>
foreach (var li in data)
{
string line = "";
foreach (var field in model.Columns)
{
doc.LoadXml(li.CustomFields);
switch (field)
{
//our standard fields
case "email":
line += li.Email + ",";
break;
case "tel":
line += li.Tel + ",";
break;
default:
line += (doc.SelectNodes("//" + field))[0].Value + ",";
break;
}
}
writer.WriteLine(line.TrimEnd(','));
}
writer.Flush();
stream.Position = 0;
return stream;
}
Run Code Online (Sandbox Code Playgroud)
并且文件(所有虚拟数据,在制作屏幕截图期间没有实际人员受到伤害):

注意:无论我是否使用,我都会得到相同的结果
writer.Flush()
和
stream.Position = 0
或不
lep*_*pie 17
你打电话GetBuffer()而不是ToArray().
请参阅:http://msdn.microsoft.com/en-us/library/system.io.memorystream.toarray
此方法从数组中省略了MemoryStream中未使用的字节.要获取整个缓冲区,请使用GetBuffer方法.
此方法将MemoryStream的内容副本作为字节数组返回.如果当前实例是在提供的字节数组上构造的,则返回此实例有权访问的数组部分的副本.有关详细信息,请参阅MemoryStream构造函数.