先看看效果(下面gif動畫製做有點大,5.71MB):html
題外話:上面選擇圖片來源於Insus.NET的新浪微博:http://weibo.com/104325017 也是昨晚(2015-07-03)Insus.NET烹飪的晚餐。若是你也想學習烹飪,也能夠關注Insus.NET的微博。
言歸正傳,因爲之前的asp.net mvc的練習文件上傳文件,顯示或是下載等博文,均是存儲於站點目錄之中。此次練習是把圖片存儲於數據庫。也就是以圖片的數據流存儲。在上傳時咱們須要把文件處理爲數據庫,顯示時,咱們須要把數據流處理爲文件。
一看上面的演示,咱們還會看到一個預覽區。選擇圖片時,預覽區會預先顯示選擇圖片。確認正確以後,咱們再上傳至數據庫中。
使用下面SQL語句建立表[dbo].[ImageStore],存儲過程2個[dbo].[usp_ImageStore_Insert]和[dbo].[usp_ImageStore_GetAll]:數據庫
CREATE TABLE [dbo].[ImageStore]( [ImageStore_nbr] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY, [Name] [nvarchar](50) NOT NULL, [MimeType] [nvarchar](50) NOT NULL, [Content] [image] NOT NULL ) GO CREATE PROCEDURE [dbo].[usp_ImageStore_Insert] ( @Name [nvarchar](50), @MimeType [nvarchar](50), @Content [image] ) AS INSERT INTO [dbo].[ImageStore] ([Name],[MimeType],[Content]) VALUES (@Name,@MimeType,@Content) GO CREATE PROCEDURE [dbo].[usp_ImageStore_GetAll] AS SELECT [ImageStore_nbr],[Name],[MimeType],[Content] FROM [dbo].[ImageStore] GO
根據數據表,咱們須要在asp.net mvc的models目錄中建立一個mode,習慣性是以數據表來建立:
因爲咱們還要處理程序與數據庫之間的交流,建立一個Entity,兩個方法,一是獲取全部數據,另外一個是爲添加數據所準備:json
上面的Entity中,有兩個標記,標記一能夠參考這篇:http://www.cnblogs.com/insus/p/4156735.html 。
標記2,Insus.NET有寫成一個Utility,也就是說把DataTable轉換爲List<T>的工具,其實有之前的asp.net mvc也有說起或是代碼分享,在此你沒必要再費時費心去搜索,參考下面代碼就是了:mvc
在上面的代碼示例中,#35行的方法,是DataTable轉換爲json序列化,因爲本例中並沒有使用到,即在此略過。
code source:asp.net
public static List<T> ToList<T>(DataTable dataTable) { var columnNames = dataTable.Columns.Cast<DataColumn>() .Select(c => c.ColumnName) .ToList(); var properties = typeof(T).GetProperties(); return dataTable.AsEnumerable().Select(row => { var objT = Activator.CreateInstance<T>(); foreach (var pro in properties) { if (columnNames.Contains(pro.Name)) pro.SetValue(objT, row[pro.Name]); } return objT; }).ToList(); }
接下來,打開控制器建立兩Action,第一個控制是視圖操做,咱們有把數據傳入視圖中。而第二個操做,是爲處理上傳文件方法所服務。ide
控制器兩個Action代碼:工具
public ActionResult ImageManagement() { ImageStoreEntity ise = new ImageStoreEntity(); var model = ise.GetAll(); return View("ImageManagement", model); } [HttpPost] public ActionResult UploadFile(IEnumerable<HttpPostedFileBase> filename) { foreach (var file in filename) { if (file.ContentLength > 0) { ImageStore imageStore = new ImageStore(); imageStore.Name = Path.GetFileName(file.FileName); imageStore.MimeType = file.ContentType; using (Stream inputStream = file.InputStream) { MemoryStream memoryStream = inputStream as MemoryStream; if (memoryStream == null) { memoryStream = new MemoryStream(); inputStream.CopyTo(memoryStream); } imageStore.Content = memoryStream.ToArray(); } ImageStoreEntity ise = new ImageStoreEntity(); ise.Insert(imageStore); } } return RedirectToAction("ImageManagement"); }
div, span, font, a, td { font-size: 13px; } table { border-collapse: collapse; border-spacing: 0; border-left: 1px solid #aaa; border-top: 1px solid #aaa; background: #efefef; } th { border-right: 1px solid #888; border-bottom: 1px solid #888; padding: 3px 15px; text-align: center; font-weight: bold; background: #ccc; font-size: 13px; } td { border-right: 1px solid #888; border-bottom: 1px solid #888; padding: 3px 15px; text-align: center; color: #3C3C3C; }
準備即時預覽圖片的js代碼:
其實這是從另一篇稍做修改而來,更多參考:http://www.cnblogs.com/insus/p/4301179.html 現成的,呵呵,那都是持續努力學習的結果。
顯示數據與動態產生Table:
上面代碼示例中,#119與#120代碼,是顯示圖片,有關base64圖片,能夠參考獨立演示:http://www.cnblogs.com/insus/p/3621199.html
固然,徹底正確應該是以下:
#122是動態指定圖片原來的mine type。語法就是簡潔與方便。
asp.net mvc圖片上傳與顯示,整個實現過程,並無怎樣的複雜。一個一個小功能來實現。
Insus.NET這大半年以來,均是以學習asp.net mvc爲主,但asp.net也有涉及,可是相對較少了。一旦以爲技術成熟,立刻使用asp.net mvc來實現專案。與你們一塊兒努力......動畫