I want to download the created CSV file without saving it in a predefined path. I'm using CSVHelper Library. (Website is not MVC based). Following is the code I'm using now.
using (var writer = new StreamWriter("path\\to\\file.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
using (var CHAIN = dt)
{
foreach (DataColumn column in CHAIN.Columns)
{
csv.WriteField(column.ColumnName);
}
csv.NextRecord();
foreach (DataRow row in CHAIN.Rows)
{
for (var i = 0; i < CHAIN.Columns.Count; i++)
{
csv.WriteField(row[i]);
}
csv.NextRecord();
}
}
But I need to download the csv file directly into the browser without defining a path from StreamWriter.
Using MemoryStream
this should be possible:
var memoryStream = new MemoryStream();
using (var writer = new StreamWriter(memoryStream)) {
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
using (var CHAIN = dt)
{
foreach (DataColumn column in CHAIN.Columns)
{
csv.WriteField(column.ColumnName);
}
csv.NextRecord();
foreach (DataRow row in CHAIN.Rows)
{
for (var i = 0; i < CHAIN.Columns.Count; i++)
{
csv.WriteField(row[i]);
}
csv.NextRecord();
}
}
writer.Flush();
}
memoryStream.Seek(0, SeekOrigin.Begin);
var resultInBytes = memoryStream.ToArray();
memoryStream.Close();
return resultInBytes;
You can return the MemoryStream
as a response the following example is just an option, since I don't know what technology are you using so this webforms related code may help you:
Response.Clear();
Response.ContentType = "text/csv"; // or application/force-download
Response.AddHeader("content-disposition", "attachment; filename=name_you_file.csv");
Response.BinaryWrite(resultInBytes);
Response.End();