دخیره سازی و واکشی تصاویر در بانک اطلاعاتی توسط MVC

در این مقاله به شما چگونگی استفاده از یک پایگاه داده برای ذخیره سازی عکس و استفاده از MVC برای فراخوانی این عکس ها با استفاده از شخصی سازی Route ها آموزش میدهیم.

دخیره سازی و واکشی تصاویر در بانک اطلاعاتی توسط MVC

هدف ما ذخیره عکس در پایگاه داده و فراخوانی آن ها در MVC با استفاده از Route  ها میباشد.

فرض های ما :

1- URL باید چیزی شبیه به  “imagebank/sample-file” یا  “imagebank/32403404303“ باشد.

2- کنترلر/اکشن  MVC یک عکس از طریق  یک ID  “sample-file”  یا “32403404303”  میگیرد و آن ها را از پایگاه داده پیدا میکند و نشان میدهد.

اگر در CACHE موجود بود ، آن را از cache می آورد و در غیر این صورت تصویر را از پایگاه داده می آورد.

پس ما میتوانیم در html به صورت زیر ان را فراخوانی کنیم.

<img src="~/imagebank/sample-file" />    

3-اگر شما میخواهید از URL دیگری استفاده کنید شما میتوانید Route بانک عکس خود را در web.config تغییر دهید.

4- اگر شما نمیخواهید که عکس را نمایش دهید و فقط میخواهید آن را دانلود کنید از  “imagebank/sample-file/download“ استفاده کنید.

پیکربندی  Route بانک عکس در :

App_Start\RouteConfig.cs

public class RouteConfig  
    {  
        public static void RegisterRoutes(RouteCollection routes)  
        {  
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");  
  
            routes.MapRoute(  
                name: "ImageBank",  
                url: GetImageBankRoute() + "/{fileId}/{action}",  
                defaults: new { controller = "ImageBank", action = "Index" }  
            );  
  
            routes.MapRoute(  
                name: "Default",  
                url: "{controller}/{action}/{id}",  
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }  
            );  
        }  
  
        private static string GetImageBankRoute()  
        {  
            var key = "imagebank:routeName";  
            var config = ConfigurationManager.AppSettings.AllKeys.Contains(key) ? ConfigurationManager.AppSettings.Get(key) : "";  
  
            return config ?? "imagebank";  
        }  
    }

کنترلر بانک تصویر در :

Controllers\ImageBankController.cs  

public class ImageBankController : Controller  
    {  
        public ImageBankController()  
        {  
            Cache = new Cache();  
            Repository = new Repository();  
        }  
          
        public ActionResult Index(string fileId, bool download = false)  
        {  
            var defaultImageNotFound = "pixel.gif";  
            var defaultImageNotFoundPath = $"~/content/img/{defaultImageNotFound}";  
            var defaultImageContentType = "image/gif";  
  
            var cacheKey = string.Format("imagebankfile_{0}", fileId);  
            Models.ImageFile model = null;  
  
            if (Cache.NotExists(cacheKey))  
            {  
                model = Repository.GetFile(fileId);  
  
                if (model == null)  
                {  
                    if (download)  
                    {  
                        return File(Server.MapPath(defaultImageNotFoundPath), defaultImageContentType, defaultImageNotFound);  
                    }  
  
                    return File(Server.MapPath(defaultImageNotFoundPath), defaultImageContentType);  
                }  
                  
                Cache.Insert(cacheKey, "Default", model);  
            }  
            else  
            {  
                model = Cache.Get(cacheKey) as Models.ImageFile;  
            }  
  
            if (download)  
            {  
                return File(model.Body, model.ContentType, string.Concat(fileId, model.Extension));  
            }  
  
            return File(model.Body, model.ContentType);  
        }  
  
        public ActionResult Download(string fileId)  
        {  
            return Index(fileId, true);  
        }  
  
        private Repository Repository { get; set; }  
  
        private Cache Cache { get; set; }  
    }  

کد بالا دارای دو اکشن است.

یکی از آنها به نام index عکس را نمایش میدهد

 و یکی دیگر از متد های اکشن به نام Download تصویر را از cache یا پایگاه داده دانلود میکند.

پایگاه داده repository  در :

Repository.cs

public class Repository  
    {  
        public static Models.ImageFile GetFile(string fileId)  
        {  
            //Just an example, use you own data repository and/or database  
            SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ImageBankDatabase"].ConnectionString);  
  
            try  
            {  
                connection.Open();  
                var sql = @"SELECT *   
                            FROM    dbo.ImageBankFile   
                            WHERE   FileId = @fileId   
                                    OR ISNULL(AliasId, FileId) = @fileId";  
  
                var command = new SqlCommand(sql, connection);  
                command.Parameters.Add("@fileId", SqlDbType.VarChar).Value = fileId;  
                command.CommandType = CommandType.Text;  
                var ada = new SqlDataAdapter(command);  
                var dts = new DataSet();  
                ada.Fill(dts);  
  
                var model = new Models.ImageFile();  
                model.Extension = dts.Tables[0].Rows[0]["Extension"] as string;  
                model.ContentType = dts.Tables[0].Rows[0]["ContentType"] as string;  
                model.Body = dts.Tables[0].Rows[0]["FileBody"] as byte[];  
  
                return model;  
            }  
            catch   
            {  
  
            }  
            finally  
            {  
                if (connection != null)  
                {  
                    connection.Close();  
                    connection.Dispose();  
                    connection = null;  
                }  
            }  
  
            return null;  
        }  
    }  

repository بسیار ساده است . این کد فقط برای ظاهر است. شما میتواند کد های خود را در اینجا پیاده سازی کنید.

برای اطلاعات بیشتر در رایطه با repository اینجا کلیک کنید.

کلاس مدل بانک تصاویر  در :

Models\ImageFile.cs

public class ImageFile  
    {  
        public byte[] Body { get; set; }  
  
        public string ContentType { get; set; }  
  
        public string Extension { get; set; }  
    } 

که این کلاس همانطور که ملاحظه میکنید شامل 3 property است.

که property  اول برای ذخیره سازی عکس به صورت باینری

property  دوم برای گرفتن محتوای عکس

و در آخر property  سوم برای گرفتن پسوند عکس  پیاده سازی شده اند.

script  ساخت جدول :

USE [ImageBankDatabase]  
GO  
  
/****** Object:  Table [dbo].[ImageBankFile]    Script Date: 11/16/2016 12:36:56 ******/  
SET ANSI_NULLS ON  
GO  
  
SET QUOTED_IDENTIFIER ON  
GO  
  
SET ANSI_PADDING ON  
GO  
  
CREATE TABLE [dbo].[ImageBankFile](  
    [FileId] [nvarchar](50) NOT NULL,  
    [AliasId] [nvarchar](100) NULL,  
    [FileBody] [varbinary](max) NULL,  
    [Extension] [nvarchar](5) NULL,  
    [ContentType] [nvarchar](50) NULL,  
 CONSTRAINT [PK_ImageBankFile] PRIMARY KEY CLUSTERED   
(  
    [FileId] ASC  
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]  
) ON [PRIMARY]  
  
GO  
  
SET ANSI_PADDING OFF  
GO  

کلاس Cache provider در :

Cache.cs

public class Cache  
    {  
        public Cache()  
        {  
            _config = ConfigurationManager.GetSection("system.web/caching/outputCacheSettings") as OutputCacheSettingsSection;  
        }  
          
        private OutputCacheSettingsSection _config;  
          
        private OutputCacheProfile GetProfile(string profile)  
        {  
            return !string.IsNullOrEmpty(profile) ? _config.OutputCacheProfiles[profile] : new OutputCacheProfile("default");  
        }  
          
        private object GetFromCache(string id)  
        {  
            if (string.IsNullOrEmpty(id)) throw new NullReferenceException("id is null");  
            if (System.Web.HttpRuntime.Cache != null)  
            {  
                lock (this)  
                {  
                    return System.Web.HttpRuntime.Cache[id];  
                }  
            }  
  
            return null;  
        }  
          
        public Cache Insert(string id, string profile, object obj)  
        {  
            if (System.Web.HttpRuntime.Cache != null)  
            {  
                if (string.IsNullOrEmpty(id))  
                {  
                    throw new ArgumentNullException("id", "id is null");  
                }  
  
                if (string.IsNullOrEmpty(profile))  
                {  
                    throw new ArgumentNullException("profile", string.Format("profile is null for id {0}", id));  
                }  
  
                var objProfile = GetProfile(profile);  
                if (objProfile == null)  
                {  
                    throw new NullReferenceException(string.Format("profile is null for id {0} and profile {1}", id, profile));  
                }  
  
                lock (this)  
                {  
                    System.Web.HttpRuntime.Cache.Insert(id, obj, null, DateTime.Now.AddSeconds(objProfile.Duration), TimeSpan.Zero);  
                }  
            }  
  
            return this;  
        }  
          
        public bool NotExists(string id)  
        {  
            return GetFromCache(id) == null;  
        }  
          
        public Cache Remove(string id)  
        {  
            if (System.Web.HttpRuntime.Cache != null)  
            {  
                lock (this)  
                {  
                    System.Web.HttpRuntime.Cache.Remove(id);  
                }  
            }  
  
            return this;  
        }  
          
        public object Get(string id)  
        {  
            return GetFromCache(id);  
        }  
    }  

دانلود نسخه ی PDF این مطلب