Link to home
Start Free TrialLog in
Avatar of j_s_kelley
j_s_kelley

asked on

Display image on web page directly from byte array.

I have successfully managed to upload images into an image field in SQL Server 2005.  I can retrieve those images in Byte array format.  I want to be able to display that image file as an image in the web page without going to file first.  In other words, stream it directly down to the browser and display the image in an <img> tag or <input type="image" or any other tags that takes some kind of src="" parameter.  So far, the only thing I have been able to conceive is making an ASPX page that reads the database, modifies the MIME type, and streams down the information that way.  Is this the best way to do something like this or is there something better?  I am using ASP.NET 3.5 and SQL Server 2005.
Avatar of Cebik
Cebik
Flag of Poland image

In windows form i think it will be looks like this..

Stream stream = new MemoryStream(bitmapInByteArray);
Image image = Image.FromStream(stream);

Open in new window

Avatar of RPCIT
RPCIT

I think what your doing would be against the "rules" of common browsers.  To do it your way I think you would have to install some kind of active-x control on the client (probably not what you want).  In essence..  HTML really hasn't changed that much on the browser side.. you have to have a file on the server.. and the browser can read HTML to download that file and display it in the browser.

I'm thinking that you don't want to go through a file because of managing the temp files.  What I have done is create my files with the session ID as part of the name (so it will be unique per session) and then I just clean out all the old sessions periodically (every 10 times a session is created or something)
Avatar of j_s_kelley

ASKER

Thanks for the info but as the question refers to I am using ASP.NET 3.5.  This is a web page, not a windows form.  This will eventually become an <img> tag or an <input Type="image> tag.  I need the SRC for this.  Normally, it is a file.
To RPCIT, I did want to get away from temp files which is why I put the info in the DB to begin with.  I would also like to apply this technique to pages which may pull up many small images (say a catalog).  This would be a nightmare of file access on the server.  I also have other security considerations imposed by the network admins (I know, I know...)
ASKER CERTIFIED SOLUTION
Avatar of Todd Gerbert
Todd Gerbert
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Thanks.  This is the way I am going to do it.  I removes the need for the temp file.  Plus, you have some extra code in there to make the transfer cleaner so I am going to modify my page to do what you are doing.  Thanks.
This little test worked for me...

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
</head>
<body>
<img src="GetPicture.aspx?SomePicID" />
</body>
</html>
public partial class GetPicture : System.Web.UI.Page
{
	private byte[] GetImage(string ImageId)
	{
		byte[] buffer;
		FileStream fs = File.Open(Server.MapPath("~/test.gif"), FileMode.Open);
		buffer = new byte[fs.Length];
		fs.Read(buffer, 0, (int)fs.Length);
		fs.Close();
		return buffer;
	}
 
    protected void Page_Load(object sender, EventArgs e)
    {
		byte[] imageBytes = GetImage(Request.QueryString["ImageID"]);
 
		Response.ClearHeaders();
		Response.ContentType = "image/gif";
 
		Response.Clear();
 
		Response.BinaryWrite(imageBytes);
    }
}

Open in new window

I like that tgerbert... I will have to play with it
Of course, you'd need to replace the GetImage() function with your code that retrieves the bytes from the database! ;)

Also, you can refer to <img src="/yourpage.aspx?PicID=PictureDBId"> to re-use the same ASPX for all your images.