Hi Ravi,

Your for loop look fine, but I believe you messed up the headers.
Don't capitalize them. Also, the 'content-disposition' header is a bit
of an anomaly. It just doesn't look right to most programmer's eyes,
and I've screwed it up also resulting in no file download. It cannot
have any (unescaped) quote characters within the value. It is a a
single string like this:  'attachment; filename=sample.csv', not
'attachment; 'filename=sample.csv'.

The easy way to remember this is that HTTP headers are just key value
pairs consisting of strings. Thus the value of all of them must be a
single string (potentially with escaped characters - not sure about
that). Fixing the headers should fix your problems. Also, the headers
must be set before the calls to res.write because they have to be
written first to the client (hence the term header).

Finally, since you already have the array in memory, writing it in
multiple chunks won't make a difference. It will just get buffered by
the OS, especially since it's all being written in a synchronous for
loop. The real reason to use streaming is so you can limit your
runtime memory consumption. This is typically achieved by receiving
some data from the db, writing it to the socket, then fetching more
from the db, etc... That way you can keep a constant memory load on
the server and not have to worry about really large stuff building up
in memory. That being said, your for loop is absolutely correct, and
the right way to do this in your circumstances. I just wanted to give
you a bit more background.

Hope that helps,
Andrew

On Wed, Jun 20, 2012 at 2:24 AM, ravi prakash <[email protected]> wrote:
>
> Hi Andrew,
>
>  Thanks for your quick response. I tried your first option.
>  Say, i have data from database in array called results,
>
>  for(var i = 0; i < results.length; i++) {
>
>       body = '';
>       body =  results[i]+'\n';
>       res.write(body);
>  }
>  res.setHeader('Content-disposition', 'attachment;
> filename='sample.csv');
>  res.setHeader('Content-type', 'text/csv');
>  res.end('');
>
>  I want to write data in chunks since my array is very big. I used
> res.write() for this. By doing this my response is written directly to
> browser
>  and file download option is not asked. How can i solve this?
>
>  -Ravi
>
>
>
>
>
>
>
>
> On Jun 20, 10:40 am, Andrew Stone <[email protected]> wrote:
>> Hi Ravi,
>>
>> Since you already have the csv content generated you just want to send
>> it out with res.write() or res.end() depending upon whether you are
>> writing it out in chunks or not (streaming).
>>
>> To get the CSV to be a downloadable file you need to add the
>> 'content-type' and 'content-disposition' headers to your response:
>>  res.header('content-type','text/csv');
>>  res.header('content-disposition', 'attachment; filename=report.csv');
>>
>> For more complex stuff, ya-csv looks useful.
>>
>> -Andrew
>>
>>
>>
>>
>>
>>
>>
>> On Wed, Jun 20, 2012 at 1:47 AM, Matthew Vickers <[email protected]> 
>> wrote:
>> > I have used ya-csv in the past, it works well for our basic usage.
>>
>> >https://github.com/koles/ya-csv
>>
>> > Matt
>>
>> > ----- "ravi prakash" <[email protected]> wrote:
>>
>> >> Hi group,
>>
>> >> How can i generate a excel/csv file from nodejs application. Say, I
>> >> have a link in webpage and on click of link, i query database and put
>> >> result into excel/csv file. Finally the file download  must be
>> >> opened.
>> >> I am building application using nodejs+express.
>>
>> >> My goal is to export data into a excel/csv file ie generate excel/csv
>> >> file from my application.
>>
>> >> Say i have link in webpage -----
>>
>> >>       <a href='/report'>Export</a>
>>
>> >> Server side i have code ------
>>
>> >> app.get('/report', function(req, res) {
>>
>> >>    //get data from db
>>
>> >>    How to put data to csv/excel file ???
>>
>> >> }
>>
>> >> --
>> >> Job Board:http://jobs.nodejs.org/
>> >> Posting guidelines:
>> >>https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
>> >> You received this message because you are subscribed to the Google
>> >> Groups "nodejs" group.
>> >> To post to this group, send email to [email protected]
>> >> To unsubscribe from this group, send email to
>> >> [email protected]
>> >> For more options, visit this group at
>> >>http://groups.google.com/group/nodejs?hl=en?hl=en
>>
>> > --
>> > Job Board:http://jobs.nodejs.org/
>> > Posting 
>> > guidelines:https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
>> > You received this message because you are subscribed to the Google
>> > Groups "nodejs" group.
>> > To post to this group, send email to [email protected]
>> > To unsubscribe from this group, send email to
>> > [email protected]
>> > For more options, visit this group at
>> >http://groups.google.com/group/nodejs?hl=en?hl=en
>
> --
> Job Board: http://jobs.nodejs.org/
> Posting guidelines: 
> https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
> You received this message because you are subscribed to the Google
> Groups "nodejs" group.
> To post to this group, send email to [email protected]
> To unsubscribe from this group, send email to
> [email protected]
> For more options, visit this group at
> http://groups.google.com/group/nodejs?hl=en?hl=en

-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

Reply via email to