.NET MVC实现多图片上传并附带参数(ajaxfileupload)
做网站呢,都免不了要做图片上传。
还记得去年做微信的时候用WebAPI+ajaxfileupload.js做了一个能够附带参数上传的功能,博文地址:.NET WebAPI 实现图片上传(包括附带参数上传图片)
这段时间在做一个网站,用的MVC5.0,有一个上传多张图片的需求...刚开始用的flash插件,这不前两天Google发文说chrome浏览器即将把HTML5作为默认设置了,flash只是对固定的几个大网站做默认了...啊哦,leader这不就顺带给咱找了点事做“把flash插件干掉,弄一个HTML5的”...
呵呵~~
也不知道leader到底知不知道啥叫HTML5,谁叫人是leader呢。
那咱就做呗?!!!
经过一天的奋战,最终效果如下:

好吧,样式是自己写的,low了点...将就着看。
废话不多说,直接上代码:
1.先来看看MVC的action。博主的网站有文件服务器,走的内网共享,要是直接存本地相信大家都会...
这里博主只是简单限制了单个文件大小,咱们可以在config里面限制一下整个大小,或者限制一下单次提交图片个数什么的....
/// <summary>
/// 图片上传 [FromBody]string type
/// 单个图片最大支持200KB
/// </summary>
/// <returns></returns>
[HttpPost]
public JsonResult ImgUpload()
{
var result = new List<ImgUploadResult>(); // 定义允许上传的文件扩展名
const string fileTypes = "gif,jpg,jpeg,png,bmp";
// 最大文件大小(200KB)
const int maxSize = ;
// 获取附带POST参数值
var type = Request["type"]; // 设置上传目录
var imgPath = "";
switch (type)
{
case "file":
imgPath = ConfigurationManager.AppSettings["HouseImgPath"];
break;
case "video":
imgPath = ConfigurationManager.AppSettings["HouseVideoPath"];
break;
case "information":
imgPath = ConfigurationManager.AppSettings["InformationPath"];
break;
}
// 存储文件服务器IP(内网)
string fileComputerIP = ConfigurationManager.AppSettings["FileComputerIP"]; for (var fileId = ; fileId < Request.Files.Count; fileId++)
{
var curFile = Request.Files[fileId];
if (curFile.ContentLength < ) {continue;}
else if (curFile.ContentLength > maxSize)
{
return this.JsonFormatError("上传文件中有图片大小超出200KB!");
}
var fileExt = Path.GetExtension(curFile.FileName);
if (String.IsNullOrEmpty(fileExt) || Array.IndexOf(fileTypes.Split(','), fileExt.Substring().ToLower()) == -)
{
return this.JsonFormatError("上传文件中包含不支持文件格式!");
}
else
{
// 存储文件名
string fullFileName = type + "_" + DateTime.Now.ToString("yyyyMMddhhmmssff") + CreateRandomCode() + fileExt; // 存储路径(绝对路径)
string virtualPath = string.Format(@"\\{0}\{1}\{2}", fileComputerIP, imgPath, fullFileName); try
{
curFile.SaveAs(virtualPath);
// 文件服务器端口号IP
string fileComputerIPPort = ConfigurationManager.AppSettings["FileComputerIPNumber"];
result.Add(new ImgUploadResult()
{
FullFileName = fullFileName,
ImgUrl = string.Format(@"http://{0}/{1}/{2}", (fileComputerIP + ":" + fileComputerIPPort), imgPath, fullFileName)
});
}
catch (Exception exception)
{
throw new Exception("上传失败!", exception);
}
}
}
return this.JsonFormatSuccess(result);
} /// <summary>
/// 生成指定长度的随机码。
/// </summary>
private string CreateRandomCode(int length)
{
string[] codes = new string[] { "", "", "", "", "", "", "", "", "", "", "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" };
StringBuilder randomCode = new StringBuilder();
Random rand = new Random();
for (int i = ; i < length; i++)
{
randomCode.Append(codes[rand.Next(codes.Length)]);
}
return randomCode.ToString();
}
2.再来看看前端代码,ajaxfileupload.js依然是用的我以前改过的一个版本,下载地址:支持附带参数提交的ajaxfileupload.js文件
3.自己写的一个imgupload的js包,没有做成jQuery扩展,简单的做了一个包,暴露了几个接口,方便调用。有兴趣的可以做成jQuery扩展
/// -------------------------
/// 图片文件上传
/// ------------------------- var imgFileUpload = (function () { var $This = [];
var ImgType = "";
var URL = ""; // 构造方法
function imgFileUpload($this, imgType, url) {
$This = $this;
ImgType = imgType;
URL = url; _bindUploadEvent();
}; // 注册上传控件事件
function _bindUploadEvent() { $.each($This, function (i, item) {
$(item).find("i.button").click(function () {
$(item).find("input").click();
});
});
} // 上传文件控件change
var fileUploadChange = function (fileControl) { var file = fileControl.files[0]; var reader = new FileReader();
reader.onload = function (evt) {
var $par = $(fileControl).parent();
// 执行上传
_uploadImage($par);
}
reader.readAsDataURL(file);
} // 上传文件
function _uploadImage($box) {
var files = $box.find("[type=file]"); $(files).each(function (index, item) {
if (item.files.length) {
$.ajaxFileUpload({
url: URL,
secureuri: false,
fileUpload: item,
dataType: 'json',
data: { "type": ImgType },
success: function (data, status) { var str = $(data).text();
var result = JSON.parse(str);
if (result.Code == 0) {
var html = "";
$.each(result.Data, function (i, dat) {
html += "<i class=\"list\"><img src=\"" + dat.ImgUrl + "\" sname=\"" + dat.FullFileName + "\" /><i onclick=\"imgFileUpload.deletedImg(this)\">删除</i></i>";
});
$box.find("div.imgShow").append(html);
} else {
alert(result.Message);
}
},
error: function (data, status, e) {
alert("上传失败!");
}
});
}
});
} // 图片删除事件
function imgDeleted($i) {
$($i).parent().remove();
} // 获取已上传图片名称组合串
function getImgNameStr() {
debugger
var result = ""; var $img = $("div.houseImgUpload i.list img");
$.each($img, function (i, item) {
if (i == $img.length - 1) {
result += $(item).attr("sname");
} else {
result += $(item).attr("sname") + ",";
}
}); return result;
} return {
init: function ($this, imgType, url) {
imgFileUpload($this, imgType, url);
},
fileUploadChange: function ($controller) {
fileUploadChange($controller);
},
deletedImg: function ($i) {
imgDeleted($i);
},
getImgNameStr: function () {
return getImgNameStr();
}
}; })();
具体代码,应该都能看懂了... init是初始化方法,页面加载完成时调用一下:
$(document).ready(function () {
imgFileUpload.init([$(".houseImgUpload")], "file", "/Common/ImgUpload/");
});
其中$(".houseImgUpload")是整个上传控件的外部DIV:
<div class="right houseImgUpload">
<i class="button">点击上传图片</i><i class="prompt">(单个文件大小不能超过200KB)</i>
<input class="file-input" type="file" name="file" multiple="true" accept="image/*" onchange="imgFileUpload.fileUploadChange(this);"/>
<div class="imgShow">
</div>
</div>
OK,一看就明白,input[type=file]是隐藏的,点击button的时候触发input[type=file]的点击事件,详见第3点的21-30行。
--- 得说一句: multiple="true" 是开启多文件上传,这个并不能兼容所有浏览器。
最后还差一个css的样式
/*
多文件上传 样式表
*/ .houseImgUpload {
width: 600px;
float: left;
} .houseImgUpload i.button {
height: 30px;
width: 220px;
background-color: #ff4400;
color: #ffffff;
display: block;
line-height: 30px;
font-size: 14px;
text-align: center;
border-radius: 3px;
-moz-border-radius: 3px;
-ms-border-radius: 3px;
-webkit-border-radius: 3px;
cursor: pointer;
float: left;
} .houseImgUpload i.prompt {
height: 30px;
line-height: 30px;
float: left;
} .houseImgUpload input.file-input {
display: none;
} .houseImgUpload div.imgShow {
height: auto;
width: 100%;
margin-top: 32px;
} .houseImgUpload div.imgShow i.list {
float: left;
position: relative;
width: 100px;
height: 120px;
display: block;
margin-left: 10px;
margin-top: 10px;
} .houseImgUpload div.imgShow i.list img {
width: 100px;
height: 100px;
} .houseImgUpload div.imgShow i.list i {
position: absolute;
top: 102px;
left: 30px;
cursor: pointer;
}
OK,以上就是这次一个多文件上传的小控件的全部代码了。
没有仔细的讲一些代码,是因为觉得都是些常规的代码,没有什么特别有含量的...所以,直接贴代码了。
整理成了一个包,放在csdn了,地址:
原创文章,代码都是从自己项目里贴出来的。转载请注明出处哦,亲~~~
.NET MVC实现多图片上传并附带参数(ajaxfileupload)的更多相关文章
- .net mvc + layui做图片上传(二)—— 使用流上传和下载图片
摘要:上篇文章写到一种上传图片的方法,其中提到那种方法的局限性,就是上传的文件只能保存在本项目目录下,在其他目录中访问不到该文件.这与浏览器的安全性机制有关,浏览器不允许用户用任意的路径访问服务器上的 ...
- .net mvc + layui做图片上传(一)
图片上传和展示是互联网应用中比较常见的一个功能,最近做的一个门户网站项目就有多个需要上传图片的功能模块.关于这部分内容,本来功能不复杂,但后面做起来却还是出现了一些波折.因为缺乏经验,对几种图片上传的 ...
- MVC微信浏览器图片上传(img转Base64)
因公司业务需要,需要做一个微信公众号里的图片上传功能,主要用到的技术就是 img转base64 上到服务器 话不多说, 贴代码 先看前端显示出来的东西 OK 图片不重要,看代码 <!--微信图片 ...
- Spring MVC MultipartFile实现图片上传
<!--Spring MVC xml 中配置 --><!-- defaultEncoding 默认编码;maxUploadSize 限制大小--><!-- 配置Multi ...
- MVC OF UEditor 图片上传- 额外参数 笔记
最近正巧需要用到UEditor ,因为需求,.需要把上传的图片数据上传到阿里云的OSS与记录图片相关信息到MS SQL中 . 不得已只能翻UEditor的实现代码>_<痛苦. 备忘笔记: ...
- MUI + Spring MVC 实现多图片上传
后台代码,主要是SpringMVC 接收多文件上传,不是用的MutilFiles 方式,主要是因为MUI 5+ 不支持文件上传的Key是同一个名字 private String saveFile(Mu ...
- C# MVC 使用 CKEditor图片上传 提示“不正确的服务器响应”
重点:看一下你使用的CKEditor版本 过程: 后台需要一款富文本编辑器.经过挑选后,最后选择了FCKEditor 的升级版 CKEditor .在官网下载了4.10.1版本. 经过一番配置后,富文 ...
- springMVC框架下——通用接口之图片上传接口
我所想要的图片上传接口是指服务器端在完成图片上传后,返回一个可访问的图片地址. spring mvc框架下图片上传非常简单,如下 @RequestMapping(value="/upload ...
- .NET WebAPI 实现图片上传(包括附带参数上传图片)
博主的项目,客户端是APP,考虑到以后也可能会应用到微信端.网站等,图片上传方法就需要兼容多端,并且以目前的设计,不允许非登录用户上传图片,就得在上传时解决附带参数上传图片的问题. 先来看看后台方法( ...
随机推荐
- Java进击C#——语法之线程同步
上一章我们讲到关于C#线程方向的应用.但是笔者并没有讲到多线程中的另一个知识点--同步.多线程的应用开发都有可能发生脏数据.同步的功能或多或少都会用到.本章就要来讲一下关于线程同步的问题.根据笔者这几 ...
- ASP.NET MVC Controller的激活
最近抽空看了一下ASP.NET MVC的部分源码,顺带写篇文章做个笔记以便日后查看. 在UrlRoutingModule模块中,将请求处理程序映射到了MvcHandler中,因此,说起Controll ...
- 【转】SQL Server -- 已成功与服务器建立连接,但是在登录过程中发生错误
SQL Server -- 已成功与服务器建立连接,但是在登录过程中发生错误 最近在VS2013上连接远程数据库时,突然连接不上,在跑MSTest下跑的时候,QTAgent32 crash.换成IIS ...
- Node.js的Formidable模块的使用
今天总结了下Node.js的Formidable模块的使用,下面做一些简要的说明. 1) 创建Formidable.IncomingForm对象 var form = new formidab ...
- 解析ListView联动的实现--仿饿了么点餐界面
一.博客的由来 大神王丰蛋哥 之前一篇博客仿饿了点餐界面2个ListView联动(http://www.cnblogs.com/wangfengdange/p/5886064.html) 主要实现了2 ...
- ASP.NET MVC搭建项目后台UI框架—11、自动加载下拉框查询
ASP.NET MVC搭建项目后台UI框架—1.后台主框架 需求:在查询记录的时候,输入第一个字,就自动把以这个字开头的相关记录查找出来,输入2个字就过滤以这两个子开头的记录,依次类推. 突然要用到这 ...
- Elasticsearch Java 虚拟机配置详解
Elasticsearch对Java虚拟机进行了预先的配置.通常情况下,因为这些配置的选择还是很谨慎的,所以你不需要太关心,并且你能立刻使用ElasticSearch. 但是,当你监视ElasticS ...
- Java 内存区域与内存溢出
内存区域 Java 虚拟机在执行 Java 程序的过程中会把他所管理的内存划分为若干个不同的数据区域.Java 虚拟机规范将 JVM 所管理的内存分为以下几个运行时数据区:程序计数器.Java 虚拟机 ...
- 调试关于Hibernate的程序遇到的问题
最怕的就是初学一些东西,低级的错误犯了又犯,现在总结出来以便以后不要再犯类似的错误. 一.Hibernate的延迟加载机制 在用hibernate底层访问数据库的过程忽略了延迟加载机制导致 在访问时候 ...
- js—模糊查询
首先要明白什么是模糊查询(废话又来了),就是根据关键字把列表中符合关键字的一项或某项罗列出来,也就是要检查列表的每一项中是否含有关键字,因此抽象一下就是一个字符串中是否含有某个字符或者字符串. 以下例 ...