Introduction
It is often a common requirement in a web application to have the ability to download some sort of file to the client's computer. This article will illustrate how
to create and download a text file to the user's computer.
Using the code
Although in the example I actually create the text file before I stream it out to the client, I feel it is important to highlight that you don't necessarily have to do this,
as the file could actually exist on the file system and you may want to stream it out to the client. If that is the case, you may need to use FileStream
to read the already
existing document.
We first open the file for reading and we actually read the file byte for byte into a stream, then once we have the file into a stream, we then just
use the Response
object and download the file via the output stream.
Response.AddHeader("Content-disposition", "attachment; filename=" + sGenName);
Response.ContentType = "application/octet-stream";
Response.BinaryWrite(btFile);
Response.End();
The real power in this snippet is in the lines above; by adding a header, you are telling the browser to download the file as an attachment. Then you set
the ContentType
header which is added, and set your MIME
type so that the browser knows what kind of file it is about to download.
You can choose any of the following MIME types for the browser:
".asf" = "video/x-ms-asf"
".avi" = "video/avi"
".doc" = "application/msword"
".zip" = "application/zip"
".xls" = "application/vnd.ms-excel"
".gif" = "image/gif"
".jpg"= "image/jpeg"
".wav" = "audio/wav"
".mp3" = "audio/mpeg3"
".mpg" "mpeg" = "video/mpeg"
".rtf" = "application/rtf"
".htm", "html" = "text/html"
".asp" = "text/asp"
'Handle All Other Files
= "application/octet-stream"
A full example of how to go about downloading a text file would like the code below:
C#
protected void Button1_Click(object sender, EventArgs e)
{
string sFileName = System.IO.Path.GetRandomFileName();
string sGenName = "Friendly.txt";
using (System.IO.StreamWriter SW = new System.IO.StreamWriter(
Server.MapPath("TextFiles/" + sFileName + ".txt")))
{
SW.WriteLine(txtText.Text);
SW.Close();
}
System.IO.FileStream fs = null;
fs = System.IO.File.Open(Server.MapPath("TextFiles/" +
sFileName + ".txt"), System.IO.FileMode.Open);
byte[] btFile = new byte[fs.Length];
fs.Read(btFile, 0, Convert.ToInt32(fs.Length));
fs.Close();
Response.AddHeader("Content-disposition", "attachment; filename=" +
sGenName);
Response.ContentType = "application/octet-stream";
Response.BinaryWrite(btFile);
Response.End();
}
VB.NET
Dim strFileName As String = System.IO.Path.GetRandomFileName()
Dim strFriendlyName As String = "Friendly.txt"
Using sw As New System.IO.StreamWriter(Server.MapPath(_
"TextFiles/" + strFileName + ".txt"))
sw.WriteLine(txtText.Text)
sw.Close()
End Using
Dim fs As System.IO.FileStream = Nothing
fs = System.IO.File.Open(Server.MapPath("TextFiles/" + strFileName + _
".txt"), System.IO.FileMode.Open)
Dim btFile(fs.Length) As Byte
fs.Read(btFile, 0, fs.Length)
fs.Close()
With Response
.AddHeader("Content-disposition", "attachment;filename=" & strFriendlyName)
.ContentType = "application/octet-stream"
.BinaryWrite(btFile)
.End()
end with
Conclusion
Using this approach, you should be able to download all types files on Windows systems, but there are some issues with Macintosh systems.
Specifically, you may not be able to download files, instead they will always open up in the browser as expected.
References