I have a table in sql server with a field called imageData type is nvarbinary(max)
I have a binary image in a radwindow.
I use the radAsyncUploader to save the image in the database.
Once the image is saved, I want to display the image to the user next to the radAsyncUploader tool (right side).
I try setting the DataValue property of the binaryImage control but that does not seem to work.. Any ideas?
protected void LinkButtonSaveImage_Click(object sender, EventArgs e) { //Handle Uploaded images if (!Object.Equals(Context.Cache.Get(Session.SessionID + "UploadedFile"), null)) { var fileType = this.AsyncUpload1.UploadedFiles[0].ContentType; User user = (User)Session["currentUser"]; AttachmentRepository attachmentRepo = new AttachmentRepository(); Stream fileStream = ((MemoryStream)Context.Cache.Remove(Session.SessionID + "UploadedFile")); byte[] attachmentBytes = new byte[fileStream.Length]; fileStream.Read(attachmentBytes, 0, Convert.ToInt32(fileStream.Length)); var attachmentService = new AttachmentService(attachmentRepo, user); attachmentService.SetAttachment(attachmentBytes, fileStream, fileType); RadBinaryImage1.DataValue = attachmentBytes; } }7 Answers, 1 is accepted
I tried to replicate the behavior you describe, however, I was unable to. Check out the attached project that I used for testing. When you click the button a byte array is generated from an image and is set as DataValue for the RadBinaryImage. Give the sample a try and let me know how it works for you.
In case there is AJAX on the page try to disable it and see if the behavior changes.
Regards,
Viktor Tachev
Telerik
See What's Next in App Development. Register for TelerikNEXT.
Viktor thanks for the example you provided, but it is for a image stored on a disk, my image has been saved to a sql server database as mentioned above... "I have a table in sql server with a field called imageData type is nvarbinary(max)"
I can get it to work for a image file saved to a disk... It is the process of getting it from the database and getting the RadBinaryImage to display it. It seems to want an actual physical location... etc.. etc..
So I have the image saving now and I found some documentation on your site, but I am having an issue retrieving the image from the database and then displaying it again.. I am not sure I am approach this correct... I will attach a zip of the code too...
Here is a bit more code to help understand what I am attempting.
SQL Create Statement to create the table...
/****** Object: Table [dbo].[tblTechAttachments] Script Date: 5/14/2015 2:59:48 PM ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE TABLE [dbo].[tblTechAttachments]( [AttachmentUID] [INT] IDENTITY(1,1) NOT NULL, [Name] [NVARCHAR](100) NULL, [ApplicationArea] [NVARCHAR](100) NULL, [Type] [NVARCHAR](50) NOT NULL, [Data] [VARBINARY](MAX) NULL, [CreatedByUserID] [INT] NOT NULL, [CreatedDate] [DATETIME] NOT NULL DEFAULT (GETDATE()), CONSTRAINT [PK_tblTechAttachments] PRIMARY KEY CLUSTERED ( [AttachmentUID] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]GOSET ANSI_PADDING ONGO
The Service that saves the data to the database....
using System;using System.Collections.Generic;using System.Configuration;using System.Data;using System.Data.Linq;using System.IO;using System.Linq;using System.Text;using System.Web.UI;using TIPWebITLibrary.BLL.AttachmentManagement.Repository;using TIPWebITLibrary.BLL.UserManagement;using TIPWebITLibrary.DAL;namespace TIPWebITLibrary.BLL.AttachmentManagement.Services{ /// <summary> /// Controls the process of adding and removing attachments /// </summary> public class AttachmentService { private readonly IUser _user; private readonly IAttachmentRepository _attachmentRepository; public AttachmentService(IUser user) { _user = user; _attachmentRepository = new AttachmentRepository(); } public AttachmentService(IAttachmentRepository attachmentRepository, IUser user) { _user = user; _attachmentRepository = attachmentRepository; } public void GetAttachment(int attachmentId) { throw new NotImplementedException(); } public byte[] GetAttachment(string applicaitonArea, out string type) { if (string.IsNullOrEmpty(applicaitonArea)) throw new ArgumentNullException("applicaitonArea", "You must provide an application area, example: {HomePageImage}"); IAttachmentRepository attachmentRepository = new AttachmentRepository(); var result = attachmentRepository.Select(applicaitonArea); if (result == null) { type = string.Empty; return null; } type = result.Type; return result.Data.ToArray(); } public bool SetAttachment(byte[] attachmentBytes, string fileType) { try { if (attachmentBytes.Length > 0) { Binary binaryObj = new Binary(attachmentBytes); var entity = new tblTechAttachment() { ApplicationArea = "HomePageArea", //TODO: use Enum instead. no magic strings Type = fileType, CreatedByUserID = this._user.UserID, CreatedDate = DateTime.Now, Data = binaryObj }; IAttachmentRepository attachmentRepository = new AttachmentRepository(); return attachmentRepository.Insert(entity); } } catch (Exception) { throw; } return false; } }}
My repository that this service uses to access the sql database...
using System;using System.Data.Linq;using System.Linq;using TIPWebITLibrary.DAL;namespace TIPWebITLibrary.BLL.AttachmentManagement.Repository{ public class AttachmentRepository : IAttachmentRepository { public tblTechAttachment Select(int id) { throw new NotImplementedException(); } public tblTechAttachment Select(string applicationArea) { if (string.IsNullOrEmpty(applicationArea)) throw new ArgumentNullException("applicationArea", "You must provide an applicationarea. Example: {HomePageImage}"); using (var db = new TIPWebITLibrary.DAL.TIPWebITDataContext()) { return db.tblTechAttachments.FirstOrDefault(x => x.ApplicationArea.Contains(applicationArea)); } } public bool Insert(tblTechAttachment entity) { int recordInserted = 0; try { using (var db = new TIPWebITLibrary.DAL.TIPWebITDataContext()) { db.GetChangeSet(); if (entity != null) { db.tblTechAttachments.InsertOnSubmit(entity); recordInserted = db.GetChangeSet().Inserts.Count; db.SubmitChanges(); } } } catch (Exception) { throw; } return recordInserted != 0; } public bool Update(tblTechAttachment entity) { throw new NotImplementedException(); } public bool Delete(tblTechAttachment entity) { throw new NotImplementedException(); } }}
My UI code behind that uses the service that saves and loads the image the user selected..
protected void LinkButtonDisplayImage_Click(object sender, EventArgs e) { //Called from javascript to update binary image control on UI side to display to user var fileType = imageMediaType.Value; var bitImage = RadBinaryImage1.DataValue; User user = (User)Session["currentUser"]; AttachmentRepository attachmentRepo = new AttachmentRepository(); // Stream fileStream = ((MemoryStream)Context.Cache.Remove(Session.SessionID + "UploadedFile")); byte[] attachmentBytes = RadBinaryImage1.DataValue; var attachmentService = new AttachmentService(attachmentRepo, user); attachmentService.SetAttachment(attachmentBytes, fileType); } public void LinkButtonSaveImage_Click(object sender, EventArgs e) { //Handle Uploaded images if (!Object.Equals(Context.Cache.Get(Session.SessionID + "UploadedFile"), null)) { var fileType = imageMediaType.Value; User user = (User)Session["currentUser"]; AttachmentRepository attachmentRepo = new AttachmentRepository(); Stream fileStream = ((MemoryStream)Context.Cache.Remove(Session.SessionID + "UploadedFile")); byte[] attachmentBytes = new byte[fileStream.Length]; fileStream.Read(attachmentBytes, 0, Convert.ToInt32(fileStream.Length)); var attachmentService = new AttachmentService(attachmentRepo, user); attachmentService.SetAttachment(attachmentBytes, fileType); } Context.Cache.Remove(Session.SessionID + "UploadedFile"); } private void getHomePageImage() { User user = (User)Session["currentUser"]; string imageType = string.Empty; AttachmentRepository attachmentRepo = new AttachmentRepository(); var attachmentService = new AttachmentService(attachmentRepo, user); Byte[] buffer = attachmentService.GetAttachment("HomePageArea",out imageType); MemoryStream memStream = new MemoryStream(buffer); //TODO: Codes is not working, it says parameter is invalid.. grrrr var resutl = Image.FromStream(memStream,true,true); } private void RadAsyncUpload1_FileUploaded(object sender, FileUploadedEventArgs e) { LinkButtonSaveImage.Enabled = true; imageMediaType.Value = e.File.ContentType; Bitmap bitmapImage = ResizeImage(RadAsyncUpload1.UploadedFiles[0].InputStream); System.IO.MemoryStream stream = new System.IO.MemoryStream(); bitmapImage.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp); RadBinaryImage1.DataValue = stream.ToArray(); // Add to session cache Context.Cache.Insert(Session.SessionID + "UploadedFile", stream, null, DateTime.Now.AddMinutes(20), TimeSpan.Zero); } public Bitmap ResizeImage(Stream stream) { System.Drawing.Image originalImage = Bitmap.FromStream(stream); int height = 100; int width = 400; Bitmap scaledImage = new Bitmap(width, height); using (Graphics g = Graphics.FromImage(scaledImage)) { g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; g.DrawImage(originalImage, 0, 0, width, height); return scaledImage; } }
The UI aspx stuff
<div style="height: 125px; padding-top: 5px; padding-left: 3px; padding-bottom: 10px !important; padding-right: 3px"> <div style="float: left; width: 225px"> <asp:HiddenField runat="server" ID="imageMediaType" Value="" /> <div style="float: left;"> <label class="Text Bold">Home Page Image</label> <telerik:RadAsyncUpload ID="RadAsyncUpload1" runat="server" OnClientFileUploaded="onClientFileUploaded" AllowedFileExtensions="jpg,png,gif,bmp" MaxFileInputsCount="1" PostbackTriggers="LinkButtonDisplayImage" MaxFileSize="2097152" Localization-Select="Browse"> </telerik:RadAsyncUpload> <label class="TextXXSmall">Recommended image size is 400X100 pixels</label> </div> <asp:Button runat="server" ID="LinkButtonDisplayImage" OnClick="LinkButtonDisplayImage_Click" CssClass="DisplayNone" /> <div style="float: left;"> <asp:Button runat="server" ID="LinkButtonSaveImage" OnClick="LinkButtonSaveImage_Click" Text="Upload Image" Enabled="False" /> </div> <div style="float: left; padding-left: 2px;"> <asp:Button ID="LinkButtonRemove" Enabled="False" runat="server" Text="Remove Image" /> </div> <div style="clear: both;"></div> </div> <div style="float: right; padding-right: 2px;"> <telerik:RadBinaryImage ID="RadBinaryImage1" runat="server" AutoAdjustImageControlSize="False" Height="100px" ImageStorageLocation="Cache" ResizeMode="Fit" Width="400px" /> </div></div>The java script:
//<![CDATA[ Sys.Application.add_load(function () { window.upload = $find("<%=RadAsyncUpload1.ClientID %>"); setting.initialize(); }); //]]>The JS file included on the page:
(function () { var $; var serverID; var upload; var setting = window.setting = window.setting || {}; setting.initialize = function () { $ = $telerik.$; upload = window.upload; }; window.onClientFileUploaded = function (sender, args) { if (upload.getUploadedFiles().length > 0) { __doPostBack('LinkButtonDisplayImage', 'LinkButtonDisplayImageArgs'); } else { alert("Please select a picture"); } }; window.updatePictureAndInfo = function () { if (upload.getUploadedFiles().length > 0) { __doPostBack('LinkButtonSaveImage', 'LinkButtonSaveImageArgs'); } else { alert("Please select a picture"); } };})();Here is the Demo I am following
http://demos.telerik.com/aspnet-ajax/asyncupload/examples/persistuploadedfiles/defaultcs.aspx?show-source=true
Ok, I figured out the problems so I figured I would post the simple solution here...
First, I was saving the data in an incorrect format which was not allowing me to pull it back out of the database..
Here are the core methods to saving and getting.. (Still need to clean up and make sure objects are disposed and null checks...etc..etc..)
This code pulls the image from the database and connects it to the RadBinaryImage control
private void getHomePageImage() { User user = (User)Session["currentUser"]; string imageType = string.Empty; AttachmentRepository attachmentRepo = new AttachmentRepository(); var attachmentService = new AttachmentService(attachmentRepo, user); Byte[] buffer = attachmentService.GetAttachment("HomePageArea", out imageType); if (buffer == null) return; RadBinaryImage1.DataValue = buffer; }This code saves it with the correct format...
public void LinkButtonSaveImage_Click(object sender, EventArgs e) { //Handle Uploaded images //if (!Object.Equals(Context.Cache.Get(Session.SessionID + "UploadedFile"), null)) //{ // var fileType = imageMediaType.Value; User user = (User)Session["currentUser"]; // AttachmentRepository attachmentRepo = new AttachmentRepository(); // Stream fileStream = ((MemoryStream)Context.Cache.Remove(Session.SessionID + "UploadedFile")); // System.Drawing.Image originalImage = Bitmap.FromStream(fileStream); // originalImage.Save(fileStream, ImageFormat.Gif); // byte[] attachmentBytes = new byte[fileStream.Length]; // fileStream.Read(attachmentBytes, 0, Convert.ToInt32(fileStream.Length)); // var attachmentService = new AttachmentService(attachmentRepo, user); // attachmentService.SetAttachment(attachmentBytes, fileType); //} //Context.Cache.Remove(Session.SessionID + "UploadedFile"); string contenttype = imageMediaType.Value; Stream fs = ((MemoryStream)Context.Cache.Remove(Session.SessionID + "UploadedFile")); BinaryReader br = new BinaryReader(fs); br.BaseStream.Position = 0; int fsLength = (int)fs.Length; Byte[] bytes = br.ReadBytes(fsLength); //insert the file into database var entity = new tblTechAttachment() { ApplicationArea = "HomePageArea", //TODO: use Enum instead. no magic strings Type = contenttype, CreatedByUserID = user.UserID, CreatedDate = DateTime.Now, Data = bytes }; //TODO: Refactor to BLL layer using (var db = new TIPWebITLibrary.DAL.TIPWebITDataContext()) { db.tblTechAttachments.InsertOnSubmit(entity); db.SubmitChanges(); } }
