我正在将FileHelpers库用于C#.net项目。一切正常,但我需要通过点击按钮保存生成的CSV。
因此,用户单击一个按钮,他们会收到保存文件的提示。我知道Filehelpers有一个WriteStream选项,但他们自己的文档只显示了WriteFile的一个例子。我不知道WriteStream是否需要,但我认为是。
有人知道是否可以将CSV文件直接保存到客户端而不是服务器硬盘?
感谢。
更新详情
我会尝试提供更多细节,以帮助澄清我正在努力实现的目标。我不想在服务器上保存任何文件。我正在使用FileHelpers生成记录,我想尝试使用他们的WriteStream方法将该记录直接写入CSV到他们的浏览器;但是他们提供的例子实际上并没有使用那种方法,奇怪的是。
以下是他们方法的链接:
http://www.filehelpers.com/FileHelpers.FileHelperEngine.WriteStream_overload_2.html
这是有问题的方法。
public void WriteStream(
TextWriter writer,
IEnumerable records,
int maxRecords
);
我可以轻松地将文件保存到服务器但不想,因为我不需要它,并希望让客户端将其直接保存到自己的计算机上。
我可能需要通过正常的路线才能实现这一目标,但我看到了WriteStream方法,并认为FileHelpers可以为实现相同结果提供一种很好的清洁方式。
希望这更清楚。
答案 0 :(得分:2)
您应该可以执行以下操作:
Response.ContentType = @"application/x-msdownload";
Response.AppendHeader("content-disposition", "attachment; filename=" + FILE_NAME);
Response.Write(csv.ToString());
Response.Flush();
Response.End();
StackOverflow上有许多更精细的建议,例如this one。这取决于你想要实现的目标。
修改强>
我认为您缺少的步骤是:
MemoryStream stream = new MemoryStream();
StreamWriter streamWriter = new StreamWriter(stream);
engine.WriteStream(streamWriter, records);
stream.Position = 0;
然后你可以使用
StreamReader reader = new StreamReader(stream);
Response.Write(reader.ReadToEnd);
而不是我上面第一个例子中的Response.Write(csv.ToString())
。
答案 1 :(得分:0)
不要忘记刷新 StreamWriter。见例子
public MemoryStream CreateCsvFileAsMemoryStream(List<TestItem> testItems) {
var engine = new FileHelperEngine<TestItemCsvMapping>();
var items = testItems.Select(ti => (TestItemCsvMapping)ti).ToList();
engine.HeaderText = engine.GetFileHeader();
var ms = new MemoryStream();
var sw = new StreamWriter(ms);
engine.WriteStream(sw, items);
sw.Flush();
//var reader = new StreamReader(ms);
//ms.Position = 0;
//Console.Write(reader.ReadToEnd());
ms.Position = 0;
return ms;
}