356

I need to send a CSV file in HTTP response. How can I set the output response as CSV format?

This is not working:

Response.ContentType = "application/CSV";
Maverick
  • 1,289
  • 4
  • 20
  • 38
balaweblog
  • 13,736
  • 28
  • 70
  • 93

11 Answers11

530

Using text/csv is the most appropriate type.

You should also consider adding a Content-Disposition header to the response. Often a text/csv will be loaded by a Internet Explorer directly into a hosted instance of Excel. This may or may not be a desirable result.

Response.AddHeader("Content-Disposition", "attachment;filename=myfilename.csv");

The above will cause a file "Save as" dialog to appear which may be what you intend.

Matt Sheppard
  • 111,039
  • 46
  • 105
  • 128
AnthonyWJones
  • 178,910
  • 32
  • 227
  • 302
171

MIME type of the CSV is text/csv according to RFC 4180.

sastanin
  • 36,792
  • 11
  • 94
  • 126
72

Use text/csv as the content type.

CJ Ramki
  • 2,614
  • 3
  • 20
  • 45
ibz
  • 38,044
  • 21
  • 65
  • 83
52

Over the years I've been honing a perfect set of headers for this that work brilliantly in all browsers that I know of

// these headers avoid IE problems when using https:
// see http://support.microsoft.com/kb/812935
header("Cache-Control: must-revalidate");
header("Pragma: must-revalidate");

header("Content-type: application/vnd.ms-excel");
header("Content-disposition: attachment; filename=$filename.csv");
dangerous
  • 529
  • 4
  • 3
29

Try one of these other mime-types (from here: http://filext.com/file-extension/CSV )

  • text/comma-separated-values
  • text/csv
  • application/csv
  • application/excel
  • application/vnd.ms-excel
  • application/vnd.msexcel

Also, the mime-type might be case sensitive...

diclophis
  • 2,394
  • 1
  • 16
  • 10
15

Just Use like that

Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + filename + ".csv\"");
Response.Write(t.ToString());
Response.End();
GateKiller
  • 68,419
  • 71
  • 167
  • 203
  • Enclosing the file name in double quotes fixed this for me when the client is Firefox. – Graham Mar 22 '11 at 08:55
  • 1
    If you're using this in an MVC controller, you'll need to end the controller method with `return new EmptyResult()` to get the filename to stick. Otherwise IE will try and save the file as `ActionName.htm`. – 3Dave Sep 16 '13 at 09:46
5

In ASP.net MVC, you can use a FileContentResult and the File method:

public FileContentResult DownloadManifest() {
    byte[] csvData = getCsvData();
    return File(csvData, "text/csv", "filename.csv");
}
Rob Church
  • 6,233
  • 2
  • 36
  • 46
3

I have found that the problem with IE is that it sniffs the return data and makes up its own mind about what content-type it thinks it has been sent. There are a number of side effect that this causes, such as always openning a saveAs dialog for text files because you are using compression of data trasnferes. The solution is (in php code)......

header('X-Content-Type-Options: nosniff');
H--
  • 87
  • 3
  • 13
Wookie
  • 31
  • 1
2

I suggest to insert an '/' character in front of 'myfilename.cvs'

Response.AddHeader("Content-Disposition", "attachment;filename=/myfilename.csv");

I hope you get better results.

Jaider
  • 12,387
  • 5
  • 59
  • 77
2

Setting the content type and the content disposition as described above produces wildly varying results with different browsers:

IE8: SaveAs dialog as desired, and Excel as the default app. 100% good.

Firefox: SaveAs dialog does show up, but Firefox has no idea it is a spreadsheet. Suggests opening it with Visual Studio! 50% good

Chrome: the hints are fully ignored. The CSV data is shown in the browser. 0% good.

Of course in all of these cases I'm referring to the browsers as they come out of they box, with no customization of the mime/application mappings.

0

For C# MVC 4.5 you need to do like this:

Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + fileName + ".csv\"");
Response.Write(dataNeedToPrint);
Response.End();
return new EmptyResult();  //this line is important else it will not work.
Suresh Kamrushi
  • 13,699
  • 12
  • 70
  • 84