Introduction
Here is perhaps the simplest, shortest way to download a file in an ASP.Net application.
Response.ContentType = "application/pdf";
Response.AppendHeader("Content-Disposition", "attachment; filename=MyFile.pdf");
Response.TransmitFile(Server.MapPath("~/Files/MyFile.pdf"));
Response.End();
The first step is to set the content type. In the example above, we're downloading a .pdf file. Here are some of the most common content types.
- .htm, .html: Response.ContentType = "text/HTML"
- .txt: Response.ContentType = "text/plain"
- .doc, .rtf, .docx: Response.ContentType = "Application/msword"
- .xls, .xlsx: Response.ContentType = "Application/x-ms excel"
- .jpg, .jpeg: Response.ContentType = "image/jpeg"
- .gif: Response.ContentType = "image/GIF"
- .pdf: Response.ContentType = "application/pdf"
Response.TransmitFile retrieves a file and writes it to the Response. By calling TransmitFile, you ensure that the browser's Open / Save dialog box opens rather than simply opening the file in the browser window.
In some cases, we can't call TransmitFile because we can't map a path to the file. Instead, we'll get the file as a Stream and write it to the Response object:
Response.ContentType = "application/pdf";
Response.AppendHeader("Content-Disposition", "attachment; filename=MyFile.pdf");
// Write the file to the Response
const int bufferLength = 10000;
byte[] buffer = new Byte[bufferLength];
int length = 0;
Stream download = null;
try
{
download = new FileStream(Server.MapPath("~/Files/Lincoln.txt"),
FileMode.Open,
FileAccess.Read);
do
{
if (Response.IsClientConnected)
{
length = download.Read(buffer, 0, bufferLength);
Response.OutputStream.Write(buffer, 0, length);
buffer = new Byte[bufferLength];
}
else
{
length = -1;
}
}
while (length > 0);
Response.Flush();
Response.End();
}
finally
{
if (download != null)
download.Close();
}
As before, the Open / Save dialog should open in the browser.
The project download includes working examples of both of these techniques.