How to display dynamic images stored in a database in a Visual WebGui application

In this “How to” we will learn how to display dynamic images stored in a database in a Visual WebGui application.

You should be familiar by now with What is Visual WebGui and What is Visual WebGui over Silverlight. It’s recommended that you read “How to create a Visual WebGui Silverlight application” and other articles in our “Get Started with Silverlight” section.

Prior to version 6.1.3, in case you wanted to display dynamic images stored in a database you had to create your own Gateway that will provide you with a virtual URL to the image. As of version 6.1.3 we can use DatabaseResourceHandle to create a virtual URL to the image.

DatabaseResourceHandle provides a base class that enables you to create a smart database resource handle. The DatabaseResourceHandle implements StaticGatewayResourceHandle, IStaticGateway.

I’ve created a new Database with a table that holds images in it.

image

Let’s create a new Visual WebGui Silverlight application.

image

Next, we’ll add three PictuerBox to our form.

image

Now, we’ll add a new class named DBPictureResourceHandle

image 

DBPictureResourceHandle will inherit from DatabaseResourceHandle

public class DBPictureResourceHandle: DatabaseResourceHandle

We will add a constructor to our class.

public DBPictureResourceHandle()

{

}

public DBPictureResourceHandle(int intImageId)

    : base(intImageId.ToString())

{

}

Next, we’ll override the GetConnection function that will set the connection to our Database.

protected override IDbConnection GetConnection()

{

    return new SqlConnection(@"Data Source=DEVSRV\SQLEXPRESS;Initial Catalog=ImageTest;Integrated Security=True;");

}

We will also override the GetDataReader function to return a Data reader according to a query that we created.

protected override IDataReader GetDataReader(IDbConnection objConnection, string strQualifier)

{

    SqlCommand objCommand = new SqlCommand("SELECT Image AS [Content], 'image/jpeg' AS ContentType FROM Images WHERE (Id = @Id)", (SqlConnection)objConnection);

    objCommand.Parameters.Add(new SqlParameter("Id", strQualifier));

    return objCommand.ExecuteReader();

}

Next, we will override the UseAuthentication property to allow us decide if the Url will require an authentication or not. For the first one we will not use authentication.

protected override bool UseAuthentication

{

    get

    {

        return false;

    }

}

Let’s open the Form1 in our application and add a button and two picture boxes.

image

On the button click event we will set the image to the picture box. We’ll add an int member called mPicId that will be the picture id that we want to display and will change every time we click the button.

int mPicId = 0;

private void button1_Click_1(object sender, EventArgs e)

{

    mPicId++;

    pictureBox1.Image = new DBPictureResourceHandle(mPicId);

}

Ok let’s run our application and see the result.

image image image

Now, we’ll create another ResourceHandle but this time it will require authentication. Create a new class named DBPictureResourceHandleAuth and copy the

DBPictureResourceHandle to it. Change the UseAuthentication to return true.

protected override bool UseAuthentication

{

    get

    {

        return true;

    }

}

Next, we’ll set the second picture box to use the DBPictureResourceHandleAuth.

public Form1()

{

    InitializeComponent();

    pictureBox2.Image = new DBPictureResourceHandleAuth(1);

}

Let’s run the application and see the result.

image

Now, let’s see how well the authentication works. To get the URL of the image I use the IE Developer Toolbar. Open it and select the first PictureBox without the authentication and copy the image URL from the value column.

image

image 

Open a new browser and paste the URL there and you will see the image.

image

Now do the same thing with the other PictureBox with the authentication and past the URL in a new browser. You will get a server error Session authentication failed.

image

This is happens because when UseAuthentication is set to true we add the session guid to the  URL.

You can override the authentication mechanism by doing this:

Adding a constructor that will get a token.

public DBPictureResourceHandleAuth(int intEmployeeID, string strToken)

    : base(intEmployeeID.ToString(), strToken)

{

}

Overriding the authentication method

protected override void Authenticate(IDbConnection objConnection, string strToken)

{

    if (strToken != "dd")

    {

        throw new HttpException(401, "The token must be 'dd'...");

    }

}

And using the new constructor to create the instance.

pictureBox2.Image = new DBPictureResourceHandleAuth(1, "dd");

To summarize:
We have seen how to use Visual WebGui DatabaseResourceHandle and we used it to display dynamic images form a database. We create a DatabaseResourceHandle without authentication and seen how to get the URL and re use it. And we’ve seen how to create an authenticated DatabaseResourceHandle that can not be used unless the right token is given.

You can read the original how to here

-- Eyal Albert @ Eyal.Albert (at) Gizmox.com

Published Tuesday, August 26, 2008 11:27 AM by Visual WebGui
Filed under: , , , ,

Comments

No Comments

Leave a Comment

(required) 
(required) 
(optional)
(required)