Download file downloads the source page instead

  • Thread starter Thread starter Simon Rigby
  • Start date Start date
S

Simon Rigby

Hi folks,

I have this code that selects a BLOB from a sql 2005 database sends it
to the browser as a download. Unfortunately the resulting file
contains the rendered page that the download operation is in as
opposed to the file. Can anyone see what is happening?

protected void gvAttachments_RowCommand(object sender,
GridViewCommandEventArgs e) {
SqlConnection cn = new
SqlConnection(ConfigurationManager.ConnectionStrings["CnString"].ConnectionString);
SqlCommand cmd = new SqlCommand("procSelectMessageAttachment", cn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@id",
int.Parse(e.CommandArgument.ToString()));

cn.Open();
SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.SingleRow);
dr.Read();

Byte[] b = new byte[dr.GetBytes(0, 0, null, 0, Int32.MaxValue)];
dr.GetBytes(0, 0, b, 0, b.Length);
string filename = dr.GetString(1);
dr.Close();
cn.Close();

MemoryStream stream = new MemoryStream(b);

try {
Byte[] buffer = new byte[10000];


int dataToRead = (int)stream.Length;
int length = 0;

Response.Clear();
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename=" +
filename);

while (dataToRead < 0) {

if (Response.IsClientConnected) {
length = stream.Read(buffer, 0, 10000);
Response.OutputStream.Write(buffer, 0, length);
Response.Flush();
buffer = new byte[10000];
dataToRead -= length;

} else { // prevent infinite loop if disconnected
dataToRead = -1;
}
}
} catch (Exception) {

} finally {
stream.Close();
}



}
 
Hi Patrice,

Yes good point and in fact I removed it to check if an exception was
being raised, but unfortunately nothing was raised.

Many Thanks

Simon
 
Woops,

I discovered that my while condition was incorrect (should have been
while (dataToRead > 0).

Now I am getting the data of the file written to the stream, but it is
immediately followed by the content of the rendered page that the
functionality is contained by.

Any ideas

Simon
 
Clear the markup if you don't need it or use Response.Clear or Response.End
once you are done to make sure nothing is rendered by the ASP.NET
infrastructure.
 
Clear the markup if you don't need it or use Response.Clear or Response.End
once you are done to make sure nothing is rendered by the ASP.NET
infrastructure.

"Simon Rigby" <[email protected]> a écrit dans le message de (e-mail address removed)...

Thanks Patrice,

Just found that and cam back to report the solution and found you
already had.

I change finally block to

stream.Close();
Response.Close();

Works a treat.

Many Thanks.
 
Back
Top