tags:

views:

284

answers:

3

I'm using C# and ASP.NET 2.5.

I want a simple way to generate a "file" on-the-fly (let's say a csv file for this example) and transmit it to the client without actually writing it to the server file system.

+4  A: 

After some searching and trial and error, I developed the following. It seems to fit the bill exactly. It should be very easily adaptable to PHP or any other server-side software since it mostly involves modifying headers.

protected void streamToResponse()
{
    Response.Clear();
    Response.AddHeader("content-disposition", "attachment; filename=testfile.csv");
    Response.AddHeader("content-type", "text/csv");

    using(StreamWriter writer = new StreamWriter(Response.OutputStream))
    {
        writer.WriteLine("col1,col2,col3");
        writer.WriteLine("1,2,3");
    }
    Response.End();
}
Eric
Yes, this is a good approach; however, this code should reside inside an ashx file. In visual studio its called a "Generic Handler" this reduced the overhead of loading an aspx page.
Nate Bross
Nate, in the case where I used this I had an "Export Report" button that was, basically, the function above. Should the button instead have somehow used an ashx?
Eric
You need "using (StreamWriter writer = new StreamWriter(Response.OutputStream)) {} in case of exceptions.
John Saunders
A: 

Use the MemoryStream Class:

http://msdn.microsoft.com/en-us/library/system.io.memorystream.aspx

Ian Jacobs
+2  A: 

May I also suggest, that if you have something other than text, say, binary, you use the Response.WriteBinary() method

I've often created a JPG on the fly, wrote it to a MemoryStream using the Bitmap.Save() method, turned the MemoryStream into a byte[] array using .ToArray() and then Response.WriteBinary() that array.

Andrew Arace