ReiRei
ReiRei

Reputation: 83

Downloading image from SQL Server on an ASP.NET C# page

I have a fileupload control that uploads an image to a SQL Server 2008 database and I want to download it with a save dialog pop up box. The code to download the file executes fine but nothing happens when I click on the download linkbutton. The event fires from the code behind. My only guess is that it is the modal popup again that is causing the issue.

<Modalpopup>
</ModalPopup>
<UpdatePanel>
   --DetailsView
    --------LinkButton(Download)
   --DetailsView
</UpdatePanel>

Is the structure of the page.

<!-- Details View here -->
            <asp:DetailsView ID="dvReviewCases" runat="server" Height="50px" 
                AutoGenerateRows="False" CssClass="dvCSS" 
                OnDataBound="dvADReviewCases_DataBound" 
                onpageindexchanging="dvReviewCases_PageIndexChanging" onitemcommand="dvReviewCases_ItemCommand"
                 >
                <Fields>

                    <asp:TemplateField HeaderStyle-CssClass="dvHeaderStyle" HeaderText="Evidence" ItemStyle-CssClass="dvValueField" > 
                        <ItemTemplate>
                            <asp:LinkButton ID="btnDownload" runat="server" Text='<%#Eval("evidenceID") %>' CommandName="Download" >
                            </asp:LinkButton>
                        </ItemTemplate>    
                    </asp:TemplateField>


                </Fields>
            </asp:DetailsView>

Code Behind

    // Download file from Evidence table
    protected void dvReviewCases_ItemCommand(object sender, DetailsViewCommandEventArgs e)
    {
        if (e.CommandName == "Download")
        {
            String strCaseID = Session["caseID"].ToString();
            String strEvidenceID = Session["evidenceID"].ToString();

            //Search for evidence file
            DbCommand cmd = GetData.CreateCommand("ADGetEvidence");
            GetData.AddParameter(cmd, strEvidenceID, "@evidenceID");
            GetData.AddParameter(cmd, strCaseID, "@caseID");
            GetData.GetResults(cmd);

            // Check if datatable has row returned
            if (GetData.getTable().Rows.Count > 0)
            {
                String fileName = "Evidence" + Session["caseID"].ToString();
                byte[] file = null;
                String fileType = GetData.getTable().Rows[0][1].ToString();

                // Typecast resulting row to byte
                file = ((byte[])GetData.getTable().Rows[0][0]);
                Response.ContentType = fileType;

                // Give user option to download file
                Response.AddHeader("Content-Disposition","attachment;filename=" + fileName);
                Response.BinaryWrite(file);

                Response.End();

            }

        }
    }

Upvotes: 0

Views: 4403

Answers (2)

user1768031
user1768031

Reputation:

Why dont you try by using query string . Here is my code where in query string is used and i fetch images from the database without having to create the any instatnce of that desired image inyour local folder. Hop this helps.

<%@ WebHandler Language="C#" Class="DisplayImg" %>

using System;
using System.Web;
using System.Configuration;
using System.IO;
using System.Data;
using System.Data.SqlClient;

public class DisplayImg : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        string theID;
        if (context.Request.QueryString["id"] != null)
            theID = context.Request.QueryString["id"].ToString();
        else
            throw new ArgumentException("No parameter specified");

        context.Response.ContentType = "image/jpeg";
        Stream strm = DisplayImage(theID);
        byte[] buffer = new byte[2048];
        int byteSeq = strm.Read(buffer, 0, 2048);

        while (byteSeq > 0)
        {
            context.Response.OutputStream.Write(buffer, 0, byteSeq);
            byteSeq = strm.Read(buffer, 0, 2048);
        }
    }

    public Stream DisplayImage(string theID)
    {
        SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["SERVER"].ConnectionString.ToString());
        string sql = "SELECT Server_image_icon FROM tbl_ServerMaster WHERE server_Code = @ID";
        SqlCommand cmd = new SqlCommand(sql, connection);
        cmd.CommandType = CommandType.Text;
        cmd.Parameters.AddWithValue("@ID", theID);
        connection.Open();
        object theImg = cmd.ExecuteScalar();
        try
        {
            return new MemoryStream((byte[])theImg);
        }
        catch
        {
            return null;
        }
        finally
        {
            connection.Close();
        }
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

Just add one line in CS code

UploadImg.ImageUrl = "~/DisplayImg.ashx?id=" + code;

Upvotes: 1

devio
devio

Reputation: 37215

A PostBack from inside an UpdatePanel can only respond with the full page, as the MSAjax magic merges the old page (in the browser) and the diff generated by the PostBack to render the new version.

Convert the LinkButton to a HyperLink with all required parameters and implement an HttpHandler to serve the binary data.

Upvotes: 0

Related Questions