前段时间将flash的上传控件替换成使用纯js实现的,在此记录

1.创建标签

<div class="camera-area" style="display:inline-block;float:left">
<input type="file" id="UploadFile" name="fileToUpload" class="fileToUpload" style="float:left;width:auto;padding:10px 0" />
<div class="upload-progress"></div>
<div class="thumb">
<img id="myPhoto" />
</div>
</div>

div内部有3个标签 第一个是上传,第二个是上传进度,第三个为了上传的预览

2.封装上传插件

   //拓展
$.extend($.fn, {
fileUpload: function (opts) {
this.each(function () {
var $self = $(this);
var doms = {
"fileToUpload": $self.find(".fileToUpload"),
"thumb": $self.find(".thumb"),
"progress": $self.find(".upload-progress")
};
var funs = {
//选择文件,获取文件大小,也可以在这里获取文件格式,限制用户上传非要求格式的文件
"fileSelected": function () {
var files = (doms.fileToUpload)[0].files;
var count = files.length;
for (var index = 0; index < count; index++) {
var file = files[index];
var fileSize = 0;
if (file.size > 1024 * 1024)
fileSize = (Math.round(file.size * 100 / (1024 * 1024)) / 100).toString() + 'MB';
else
fileSize = (Math.round(file.size * 100 / 1024) / 100).toString() + 'KB';
}
funs.uploadFile();
},
//异步上传文件
uploadFile: function () {
var fd = new FormData();//创建表单数据对象
var files = (doms.fileToUpload)[0].files;
var count = files.length;
for (var index = 0; index < count; index++) {
var file = files[index];
fd.append(opts.file, file);//将文件添加到表单数据中
funs.previewImage(file);//上传前预览图片,也可以通过其他方法预览txt
}
var xhr = new XMLHttpRequest();
xhr.upload.addEventListener("progress", funs.uploadProgress, false);//监听上传进度
xhr.addEventListener("load", funs.uploadComplete, false);
xhr.addEventListener("error", opts.uploadFailed, false); xhr.open("POST", opts.url);
xhr.send(fd);
},
//文件预览
previewImage: function (file) {
var gallery = doms.thumb;
var img = document.createElement("img");
img.file = file;
doms.thumb.html(img);
// 使用FileReader方法显示图片内容
var reader = new FileReader();
reader.onload = (function (aImg) {
return function (e) {
aImg.src = e.target.result;
};
})(img);
reader.readAsDataURL(file);
},
uploadProgress: function (evt) {
if (evt.lengthComputable) {
var percentComplete = Math.round(evt.loaded * 100 / evt.total);
doms.progress.html(percentComplete.toString() + '%');
}
},
"uploadComplete": function (evt) {
var returnModel = JSON.parse(evt.target.responseText);
if (returnModel.url) {
$("#" + opts.id).val(returnModel.url);
}
if (!returnModel.success) {
alert(returnModel.msg);
$(".upload-progress").html("0%");
$(".thumb img").attr("src", "");
$("#" + opts.id).val("");
}
}
};
doms.fileToUpload.on("change", function () {
doms.progress.find("span").width("0");
funs.fileSelected();
});
});
}
});

3.调用封装的控件

 $(".camera-area").fileUpload({
"url": "/Home/SavePhoto",
"file": "fileName",
"id": "Photo"
});

url:上传的位置

file:后台接收此文件的参数

id:当前是冗余拓展,博主本意是上传到服务器后返回个url,url指向上传文件的服务器路径

4.控制器接收文件并且保存(简单实现)

         [HttpPost]
/// <summary>
/// 上传文件
/// </summary>
/// <returns></returns>
public ActionResult SavePhoto()
{
//fileName要和视图的插件参数一致
HttpPostedFileBase file = HttpContext.Request.Files["fileName"];
string savePath = Path.Combine(Server.MapPath("~/Temp/"), DateTime.Now.Year.ToString(), DateTime.Now.Month.ToString());
if (!Directory.Exists(savePath))
{
Directory.CreateDirectory(savePath);
}
string fileName = DateTime.Now.ToString("yyyyMMddHHmmss") + Path.GetExtension(file.FileName);
fileName = Path.Combine(savePath, fileName);
file.SaveAs(fileName);
return this.Json(new { success = true });
}

5.效果演示

最新文章

  1. jQuery插件中文乱码解决办法
  2. OC语言中BOOL 和 bool 区别
  3. HTTP抓包神器HTTP Analyzer V7 Build7.5.4汉化+注册机
  4. 如何修改myeclipse 内存?eclipse.ini中各个参数的作用。
  5. 解决Scrapy抓取中文结果保存为文件时的编码问题
  6. HDU 4951 Multiplication table 阅读题
  7. java面试题—精选30道Java笔试题解答(二)
  8. KNN算法的代码实现
  9. 【一天一道LeetCode】#122. Best Time to Buy and Sell Stock II
  10. 免费开源ERP Odoo实施指南 连载一:Odoo概述
  11. Go语言系列文章
  12. MySQL复制表-CREATE SELECT
  13. mysql中的int和tinyint、varchar和char、DateTime和TimeStamp区别
  14. java 中 byte[]、File、InputStream 互相转换
  15. Nginx记录-nginx 负载均衡5种配置方式(转载)
  16. Mongod服务器安装
  17. MYSQL 优化常用方法总结
  18. mysql 返回结果按照指定的id顺序返回
  19. MyBatis 支持的扩展点(version:3.2.7)
  20. ZH奶酪:【数据结构与算法】基础排序算法总结与Python实现

热门文章

  1. pat Public Bike Management (30)
  2. 个人环境搭建——版本控制SVN
  3. 模块(二)——简单的log日志
  4. live-server 快速搭建静态服务
  5. javascript版string.Format
  6. hdu 6218 Bridge 线段树 set
  7. error: expected class-name before &#39;{&#39; token(转)
  8. 转:C#制作ORM映射学习笔记三 ORM映射实现
  9. 移动端web如何让页面强制横屏
  10. Hadoop OutputFormat浅析