What I have?
I have an ASP.NET page which allows the user to download file a
on a button click. User can select the file he wants from
Offhand, what you're doing should work. I've successfully done similar in the past, although I used a repeater and LinkButtons.
The only thing I can see that's different is that you're using Response.Write()
rather than Response.OutputStream.Write()
, and that you're writing text rather than binary, but given the ContentType
you specified, it shouldn't be a problem. Additionally, I call Response.ClearHeaders()
before sending info, and Response.Flush()
afterward (before my call to Response.End()
).
If it will help, here's a sanitized version of what works well for me:
// called by click handler after obtaining the correct MyFileInfo class.
private void DownloadFile(MyFileInfo file)
{
Response.Clear();
Response.ClearHeaders();
Response.ContentType = "application/file";
Response.AddHeader("Content-Disposition", "attachment; filename=\"" + file.FileName + "\"");
Response.AddHeader("Content-Length", file.FileSize.ToString());
Response.OutputStream.Write(file.Bytes, 0, file.Bytes.Length);
Response.Flush();
Response.End();
}
You may want to consider transferring the file in a binary way, perhaps by calling System.Text.Encoding.ASCII.GetBytes(viewXml);
and passing the result of that to Response.OutputStream.Write()
.
Modifying your code slightly:
protected void btnDownload_Click(object sender, EventArgs e)
{
string viewXml = exporter.Export();
byte [] bytes = System.Text.Encoding.ASCII.GetBytes(viewXml);
// NOTE: you should use whatever encoding your XML file is set for.
// Alternatives:
// byte [] bytes = System.Text.Encoding.UTF7.GetBytes(viewXml);
// byte [] bytes = System.Text.Encoding.UTF8.GetBytes(viewXml);
Response.Clear();
Response.ClearHeaders();
Response.AddHeader("Content-Disposition", "attachment; filename=views.cov");
Response.AddHeader("Content-Length", bytes.Length.ToString());
Response.ContentType = "application/file";
Response.OutputStream.Write(bytes, 0, bytes.Length);
Response.Flush();
Response.End();
}