.NET MVC实现多图片上传并附带参数(ajaxfileupload)
来源:互联网 发布:java 就业班 编辑:程序博客网 时间:2024/05/16 01:03
做网站呢,都免不了要做图片上传。
还记得去年做微信的时候用WebAPI+ajaxfileupload.js做了一个能够附带参数上传的功能,博文地址:.NET WebAPI 实现图片上传(包括附带参数上传图片)
这段时间在做一个网站,用的MVC5.0,有一个上传多张图片的需求...刚开始用的flash插件,这不前两天Google发文说chrome浏览器即将把HTML5作为默认设置了,flash只是对固定的几个大网站做默认了...啊哦,leader这不就顺带给咱找了点事做“把flash插件干掉,弄一个HTML5的”...
呵呵~~
也不知道leader到底知不知道啥叫HTML5,谁叫人是leader呢。
那咱就做呗?!!!
经过一天的奋战,最终效果如下:
好吧,样式是自己写的,low了点...将就着看。
废话不多说,直接上代码:
1.先来看看MVC的action。博主的网站有文件服务器,走的内网共享,要是直接存本地相信大家都会...
这里博主只是简单限制了单个文件大小,咱们可以在config里面限制一下整个大小,或者限制一下单次提交图片个数什么的....
1 /// <summary> 2 /// 图片上传 [FromBody]string type 3 /// 单个图片最大支持200KB 4 /// </summary> 5 /// <returns></returns> 6 [HttpPost] 7 public JsonResult ImgUpload() 8 { 9 var result = new List<ImgUploadResult>();10 11 // 定义允许上传的文件扩展名 12 const string fileTypes = "gif,jpg,jpeg,png,bmp";13 // 最大文件大小(200KB)14 const int maxSize = 205000;15 // 获取附带POST参数值16 var type = Request["type"];17 18 // 设置上传目录 19 var imgPath = "";20 switch (type)21 {22 case "file":23 imgPath = ConfigurationManager.AppSettings["HouseImgPath"];24 break;25 case "video":26 imgPath = ConfigurationManager.AppSettings["HouseVideoPath"];27 break;28 case "information":29 imgPath = ConfigurationManager.AppSettings["InformationPath"];30 break;31 }32 // 存储文件服务器IP(内网)33 string fileComputerIP = ConfigurationManager.AppSettings["FileComputerIP"];34 35 36 for (var fileId = 0; fileId < Request.Files.Count; fileId++)37 {38 var curFile = Request.Files[fileId];39 if (curFile.ContentLength < 1) {continue;}40 else if (curFile.ContentLength > maxSize)41 {42 return this.JsonFormatError("上传文件中有图片大小超出200KB!");43 }44 var fileExt = Path.GetExtension(curFile.FileName);45 if (String.IsNullOrEmpty(fileExt) || Array.IndexOf(fileTypes.Split(','), fileExt.Substring(1).ToLower()) == -1)46 {47 return this.JsonFormatError("上传文件中包含不支持文件格式!");48 }49 else50 {51 // 存储文件名52 string fullFileName = type + "_" + DateTime.Now.ToString("yyyyMMddhhmmssff") + CreateRandomCode(8) + fileExt;53 54 // 存储路径(绝对路径)55 string virtualPath = string.Format(@"\\{0}\{1}\{2}", fileComputerIP, imgPath, fullFileName);56 57 try58 {59 curFile.SaveAs(virtualPath);60 // 文件服务器端口号IP61 string fileComputerIPPort = ConfigurationManager.AppSettings["FileComputerIPNumber"];62 result.Add(new ImgUploadResult()63 {64 FullFileName = fullFileName,65 ImgUrl = string.Format(@"http://{0}/{1}/{2}", (fileComputerIP + ":" + fileComputerIPPort), imgPath, fullFileName)66 });67 }68 catch (Exception exception)69 {70 throw new Exception("上传失败!", exception);71 }72 }73 }74 return this.JsonFormatSuccess(result);75 }76 77 /// <summary>78 /// 生成指定长度的随机码。79 /// </summary>80 private string CreateRandomCode(int length)81 {82 string[] codes = new string[36] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };83 StringBuilder randomCode = new StringBuilder();84 Random rand = new Random();85 for (int i = 0; i < length; i++)86 {87 randomCode.Append(codes[rand.Next(codes.Length)]);88 }89 return randomCode.ToString();90 }
2.再来看看前端代码,ajaxfileupload.js依然是用的我以前改过的一个版本,下载地址:支持附带参数提交的ajaxfileupload.js文件
3.自己写的一个imgupload的js包,没有做成jQuery扩展,简单的做了一个包,暴露了几个接口,方便调用。有兴趣的可以做成jQuery扩展
1 /// ------------------------- 2 /// 图片文件上传 3 /// ------------------------- 4 5 var imgFileUpload = (function () { 6 7 var $This = []; 8 var ImgType = ""; 9 var URL = ""; 10 11 // 构造方法 12 function imgFileUpload($this, imgType, url) { 13 $This = $this; 14 ImgType = imgType; 15 URL = url; 16 17 _bindUploadEvent(); 18 }; 19 20 // 注册上传控件事件 21 function _bindUploadEvent() { 22 23 $.each($This, function (i, item) { 24 $(item).find("i.button").click(function () { 25 $(item).find("input").click(); 26 }); 27 }); 28 } 29 30 // 上传文件控件change 31 var fileUploadChange = function (fileControl) { 32 33 var file = fileControl.files[0]; 34 35 var reader = new FileReader(); 36 reader.onload = function (evt) { 37 var $par = $(fileControl).parent(); 38 // 执行上传 39 _uploadImage($par); 40 } 41 reader.readAsDataURL(file); 42 } 43 44 // 上传文件 45 function _uploadImage($box) { 46 var files = $box.find("[type=file]"); 47 48 $(files).each(function (index, item) { 49 if (item.files.length) { 50 $.ajaxFileUpload({ 51 url: URL, 52 secureuri: false, 53 fileUpload: item, 54 dataType: 'json', 55 data: { "type": ImgType }, 56 success: function (data, status) { 57 58 var str = $(data).text(); 59 var result = JSON.parse(str); 60 if (result.Code == 0) { 61 var html = ""; 62 $.each(result.Data, function (i, dat) { 63 html += "<i class=\"list\"><img src=\"" + dat.ImgUrl + "\" sname=\"" + dat.FullFileName + "\" /><i onclick=\"imgFileUpload.deletedImg(this)\">删除</i></i>"; 64 }); 65 $box.find("div.imgShow").append(html); 66 } else { 67 alert(result.Message); 68 } 69 }, 70 error: function (data, status, e) { 71 alert("上传失败!"); 72 } 73 }); 74 } 75 }); 76 } 77 78 // 图片删除事件 79 function imgDeleted($i) { 80 $($i).parent().remove(); 81 } 82 83 // 获取已上传图片名称组合串 84 function getImgNameStr() { 85 debugger 86 var result = ""; 87 88 var $img = $("div.houseImgUpload i.list img"); 89 $.each($img, function (i, item) { 90 if (i == $img.length - 1) { 91 result += $(item).attr("sname"); 92 } else { 93 result += $(item).attr("sname") + ","; 94 } 95 }); 96 97 return result; 98 } 99 100 101 return {102 init: function ($this, imgType, url) {103 imgFileUpload($this, imgType, url);104 },105 fileUploadChange: function ($controller) {106 fileUploadChange($controller);107 },108 deletedImg: function ($i) {109 imgDeleted($i);110 },111 getImgNameStr: function () {112 return getImgNameStr();113 }114 };115 116 })();
具体代码,应该都能看懂了... init是初始化方法,页面加载完成时调用一下:
1 $(document).ready(function () {2 imgFileUpload.init([$(".houseImgUpload")], "file", "/Common/ImgUpload/");3 });
其中$(".houseImgUpload")是整个上传控件的外部DIV:
1 <div class="right houseImgUpload">2 <i class="button">点击上传图片</i><i class="prompt">(单个文件大小不能超过200KB)</i>3 <input class="file-input" type="file" name="file" multiple="true" accept="image/*" onchange="imgFileUpload.fileUploadChange(this);"/>4 <div class="imgShow">5 </div>6 </div>
OK,一看就明白,input[type=file]是隐藏的,点击button的时候触发input[type=file]的点击事件,详见第3点的21-30行。
--- 得说一句: multiple="true" 是开启多文件上传,这个并不能兼容所有浏览器。
最后还差一个css的样式
1 /* 2 多文件上传 样式表 3 */ 4 5 .houseImgUpload { 6 width: 600px; 7 float: left; 8 } 9 10 .houseImgUpload i.button {11 height: 30px;12 width: 220px;13 background-color: #ff4400;14 color: #ffffff;15 display: block;16 line-height: 30px;17 font-size: 14px;18 text-align: center;19 border-radius: 3px;20 -moz-border-radius: 3px;21 -ms-border-radius: 3px;22 -webkit-border-radius: 3px;23 cursor: pointer;24 float: left;25 }26 27 .houseImgUpload i.prompt {28 height: 30px;29 line-height: 30px;30 float: left;31 }32 33 .houseImgUpload input.file-input {34 display: none;35 }36 37 .houseImgUpload div.imgShow {38 height: auto;39 width: 100%;40 margin-top: 32px;41 }42 43 .houseImgUpload div.imgShow i.list {44 float: left;45 position: relative;46 width: 100px;47 height: 120px;48 display: block;49 margin-left: 10px;50 margin-top: 10px;51 }52 53 .houseImgUpload div.imgShow i.list img {54 width: 100px;55 height: 100px;56 }57 58 .houseImgUpload div.imgShow i.list i {59 position: absolute;60 top: 102px;61 left: 30px;62 cursor: pointer;63 }
OK,以上就是这次一个多文件上传的小控件的全部代码了。
没有仔细的讲一些代码,是因为觉得都是些常规的代码,没有什么特别有含量的...所以,直接贴代码了。
整理成了一个包,放在csdn了,地址:
MVC+ajaxfileupload实现多图片同时上传
- .NET MVC实现多图片上传并附带参数(ajaxfileupload)
- .NET MVC实现多图片上传并附带参数(ajaxfileupload)
- spring mvc+ajaxfileupload 实现异步上传图片
- ajaxFileUpload实现图片的上传并预览
- freemarker+springMVC+ajaxfileupload实现异步图片上传(多张)
- android上传图片并附带参数至服务器
- 使用ajaxfileupload插件实现异步上传并保存图片功能
- 通过修改ajaxFileUpload.js实现多图片动态上传并实现预览
- spring mvc 文件、图片上传(极简)ajaxFileUpload
- Ajaxfileupload上传多张图片
- 关于$.ajaxFileUpload()上传图片
- springmvc + ajaxfileupload 实现异步上传文件(图片)
- springmvc + ajaxfileupload 实现异步上传文件(图片)
- springmvc + ajaxfileupload 实现异步上传文件(图片)
- freemarker+springMVC+ajaxfileupload实现异步图片上传(单张)
- springmvc+ajaxfileupload实现头像上传并预览
- Asp.net MVC 实现图片上传剪切
- ajaxfileupload.js 实现异步上传图片
- Lua 性能优化
- iOS中-Block使用
- 迷之RxJava —— 线程切换
- 怎么防止服务器的任务因断网中断(linux screen 命令详解)
- java并发编程:顺序输出A、B、C循环10次
- .NET MVC实现多图片上传并附带参数(ajaxfileupload)
- NYOJ 164 Game of Connections
- Dubbo消费者配置
- ls
- Nhiernate 学习(一),环境准备
- AndroidStudio下SVN使用介绍
- jQuery 自定义事件
- 可扩散列
- 【C++专题】static_cast, dynamic_cast, const_cast探讨