您好,登錄后才能下訂單哦!
這篇文章主要講解了“怎么用.net mvc+layui實(shí)現(xiàn)圖片上傳功能”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“怎么用.net mvc+layui實(shí)現(xiàn)圖片上傳功能”吧!
圖片上傳和展示是互聯(lián)網(wǎng)應(yīng)用中比較常見(jiàn)的一個(gè)功能,本文圖片上傳功能前端用到的圖片上傳控件是layui ,數(shù)據(jù)庫(kù)是用的 sql server ,code first開(kāi)發(fā)模式。
一、創(chuàng)建表
因?yàn)閳D片上傳之后需要保存路徑等信息,所以,得先建一個(gè)Image表,表的設(shè)計(jì)為如下:
下面看實(shí)體類(lèi)和上下文的代碼:
1.新建實(shí)體類(lèi)Image.cs
如圖:
代碼如下:
Image.cs
using System;using System.Collections.Generic;using System.ComponentModel.DataAnnotations;using System.ComponentModel.DataAnnotations.Schema;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Modules{ [Table("Info_Image")] public class Image { public Image() { IsDelete = false; } /// <summary> /// 主鍵id /// </summary> public Guid Id { get; set; } /// <summary> /// 圖片名 /// </summary> [Required] [MaxLength(50)] public string Name { get; set; } /// <summary> /// 圖片保存鏈接 /// </summary> [Required] [MaxLength(50)] public string Url { get; set; } /// <summary> /// 上傳時(shí)間 /// </summary> public DateTime UploadTime { get; set; } /// <summary> /// 備注 /// </summary> [MaxLength(200)] public string Remark { get; set; } /// <summary> /// 是否刪除 /// </summary> public bool IsDelete { get; set; } }}
2.將實(shí)體類(lèi)添加到上下文:
如圖:
代碼:
MyDbContext.cs
public DbSet<Image> Images { get; set; }
如果你和我一樣是code first開(kāi)發(fā)模式的話,那讓程序跑一遍,這個(gè)數(shù)據(jù)表就應(yīng)該在你的數(shù)據(jù)庫(kù)里生成了,哈哈,這只是一個(gè)建表的過(guò)程,只要表能建好,什么模式都好,哈哈。
二、前端代碼
1.新建控制器ImageUploadController.cs,然后創(chuàng)建一個(gè)視圖Index.cshtml:
這里會(huì)用到layui的圖片上傳,關(guān)于這部分的代碼使用,可以自行去layui官網(wǎng)查看:https://www.layui.com/demo/upload.html;
以下是頁(yè)面圖片,以及代碼:
這是還沒(méi)編寫(xiě)后臺(tái)上傳圖片代碼時(shí)的頁(yè)面圖片:
以下是前端代碼:
@{ Layout = "../Shared/_TopLayout.cshtml";}<!DOCTYPE html><html><head> <meta name="viewport" content="width=device-width" /> <title>Index</title></head><body> <div id="picUpload"> <div class="layui-form-item"> <label class="layui-form-label required">圖片標(biāo)題</label> <div class="layui-input-block" style="width: 554px; position: relative;"> <input type="text" name="ImageTitle" lay-verify="required" placeholder="圖片標(biāo)題" autocomplete="off" class="layui-input" id="ITitle"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">備注</label> <div class="layui-input-block" style="width: 554px; position: relative;"> <textarea placeholder="請(qǐng)輸入內(nèi)容" class="layui-textarea" name="Remark"></textarea> </div> </div> <div class="layui-form-item"> <div class="layui-upload"> <label class="layui-form-label">上傳圖片</label> <button type="button" class="layui-btn" id="test1">上傳圖片</button> <div class="layui-upload-list"> <label class="layui-form-label">圖片展示</label> <img class="layui-upload-img" id="demo1" style="width:200px;height:auto;"> <p id="demoText"></p> </div> </div> </div> </div></body></html><script type="text/javascript"> layui.use('upload', function () { var $ = layui.jquery; var upload = layui.upload; //普通圖片上傳 var uploadInst = upload.render({ elem: '#test1', url: '@Url.Action("Upload","ImageUpload")', //上傳地址,后臺(tái)的某個(gè)控制器 before: function (obj) { obj.preview(function (index, file, result) { $('#demo1').attr('src', result); }); }, //長(zhǎng)傳之前執(zhí)行的代碼,將需要上傳的圖片顯示在頁(yè)面上 done: function (res) { if (res.Result) { } }, //上傳成功后的回傳數(shù)據(jù),后臺(tái)代碼未編寫(xiě),此處尚為寫(xiě)任何內(nèi)容,將在后面的內(nèi)容中補(bǔ)上 error: function () { //演示失敗狀態(tài),并實(shí)現(xiàn)重傳 var demoText = $('#demoText'); demoText.html('<span style="color: #FF5722;">上傳失敗</span> <a class="layui-btn layui-btn-xs demo-reload">重試</a>'); demoText.find('.demo-reload').on('click', function () { uploadInst.upload(); }); } }); });</script>
三、后臺(tái)代碼及前端代碼完善
接下來(lái)在上面代碼所示的后臺(tái)鏈接()中編寫(xiě)圖片上傳代碼:
下面先貼出代碼,然后再講解上傳思路:
ImageUploadController.cs
/// <summary> /// 上傳圖片 /// </summary> /// <returns></returns> public ActionResult Upload() { try { HttpFileCollectionBase files = Request.Files; HttpPostedFileBase file = files[0]; //獲取文件名后綴 string extName = Path.GetExtension(file.FileName).ToLower(); //獲取保存目錄的物理路徑 if (System.IO.Directory.Exists(Server.MapPath("/Images/")) == false)//如果不存在就創(chuàng)建images文件夾 { System.IO.Directory.CreateDirectory(Server.MapPath("/Images/")); } string path = Server.MapPath("/Images/"); //path為某個(gè)文件夾的絕對(duì)路徑,不要直接保存到數(shù)據(jù)庫(kù) // string path = "F:\\TgeoSmart\\Image\\"; //生成新文件的名稱,guid保證某一時(shí)刻內(nèi)圖片名唯一(文件不會(huì)被覆蓋) string fileNewName = Guid.NewGuid().ToString(); string ImageUrl = path + fileNewName + extName; //SaveAs將文件保存到指定文件夾中 file.SaveAs(ImageUrl); //此路徑為相對(duì)路徑,只有把相對(duì)路徑保存到數(shù)據(jù)庫(kù)中圖片才能正確顯示(不加~為相對(duì)路徑) string url = "\\Images\\" + fileNewName + extName; return Json(new { Result = true, Data = url }); } catch (Exception exception) { return Json(new { Result = false, exception.Message }); } }
上面一段代碼里有詳細(xì)的注釋信息,這里需要注意的是,我們保存圖片的路徑的問(wèn)題。
Server.MapPath()函數(shù)獲取的是某個(gè)文件夾的絕對(duì)路徑,關(guān)于這個(gè)函數(shù)的一些用法我百度一份截圖貼在這里:
Server.MapPath()獲取的是圖片的絕對(duì)路徑,而實(shí)際調(diào)用圖片時(shí),考慮到網(wǎng)站安全性問(wèn)題,瀏覽器并不允許我們的頁(yè)面使用絕對(duì)路徑去獲取圖片資源,因此,在數(shù)據(jù)庫(kù)中保存的路徑只能是相對(duì)路徑,也就是代碼中這一句的作用:
上面代碼中,我并沒(méi)有直接保存imageUrl到數(shù)據(jù)庫(kù)中,另外生成一個(gè)相對(duì)路徑保存圖片,原因就是這個(gè)。
下面給出完整的前端代碼,包括圖片上傳的改進(jìn)和所有信息的保存:
@{ Layout = "../Shared/_TopLayout.cshtml";}<!DOCTYPE html><html><head> <meta name="viewport" content="width=device-width" /> <title>Index</title></head><body> <div id="picUpload"><!--新增代碼,添加信息保存按鈕--> <div class="layui-form-item sel-fixed-right"> <div class="layui-input-block"> <input type="button" class="layui-btn layui-btn-small layui-btn-normal" value="保存" onclick="saveInfo()" /> </div> </div> <div class="layui-form-item"> <label class="layui-form-label required">圖片標(biāo)題</label> <div class="layui-input-block" style="width: 554px; position: relative;"> <input type="text" name="ImageTitle" lay-verify="required" placeholder="圖片標(biāo)題" autocomplete="off" class="layui-input" id="iTitle"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">備注</label> <div class="layui-input-block" style="width: 554px; position: relative;"> <textarea placeholder="請(qǐng)輸入內(nèi)容" class="layui-textarea" name="Remark" id="iRemark"></textarea> </div> </div> <div class="layui-form-item"> <div class="layui-upload"> <label class="layui-form-label">上傳圖片</label> <button type="button" class="layui-btn" id="test1">上傳圖片</button> <div class="layui-upload-list"> <label class="layui-form-label">圖片上傳前展示</label> <img class="layui-upload-img" id="demo1" style="width:200px;height:auto;"> <p id="demoText"></p> </div><!--新增代碼,上傳后圖片顯示 -- > <div class="layui-upload-list"> <label class="layui-form-label">圖片上傳后展示</label> <img class="layui-upload-img" id="demo2" style="width:200px;height:auto;"> </div> </div> </div> </div></body></html><script type="text/javascript"> var imageUrl;//新增代碼,保存上傳圖片后回傳的圖片路徑 layui.use('upload', function () { var $ = layui.jquery; var upload = layui.upload; //普通圖片上傳 var uploadInst = upload.render({ elem: '#test1', url: '@Url.Action("Upload","ImageUpload")', before: function (obj) { obj.preview(function (index, file, result) { $('#demo1').attr('src', result); }); }, done: function (res) { if (res.Result) { //新增代碼,將回傳的圖片保存路徑進(jìn)行保存并將圖片綁定到上傳后圖片展示處 imageUrl = res.Data; $("#demo2").attr("src", imageUrl); } }, error: function () { //演示失敗狀態(tài),并實(shí)現(xiàn)重傳 var demoText = $('#demoText'); demoText.html('<span style="color: #FF5722;">上傳失敗</span> <a class="layui-btn layui-btn-xs demo-reload">重試</a>'); demoText.find('.demo-reload').on('click', function () { uploadInst.upload(); }); } }); });//新增代碼,將完整的信息傳到后臺(tái)保存 var saveInfo = function () { $.ajax({ type: 'post', url: '@Url.Action("Save", "ImageUpload")', dataType: 'json', data: { title: $("#iTitle").val(), remark: $("#iRemark").val(), url:imageUrl }, success: function (res) { if (res.Result) { alert("保存成功"); } } }); }</script>
然后,補(bǔ)齊后端信息保存的代碼:
public ActionResult Save(string title,string remark,string url) { try { var imageInfo = new ImageInfo() { Id = Guid.NewGuid(), Name = title, Url = url, Remark = remark, UploadTime = DateTime.Now.ToLocalTime() }; context.ImageInfos.Add(imageInfo); context.SaveChanges(); return Json(new{ Result = true }); } catch (Exception exception) { return Json(new { Result = true, exception.Message }); } }
感謝各位的閱讀,以上就是“怎么用.net mvc+layui實(shí)現(xiàn)圖片上傳功能”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)怎么用.net mvc+layui實(shí)現(xiàn)圖片上傳功能這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。