H5手机端多文件上传预览插件


Posted in Javascript onApril 21, 2017

基于zepto,支持多文件上传,进度和图片预览,用于手机端。

(function ($) {
 $.extend($, {
 fileUpload: function (options) {
 var para = {
 multiple: true,
 filebutton: ".filePicker",
 uploadButton: null,
 url: "/home/MUploadImg",
 filebase: "mfile",//mvc后台需要对应的名称
 auto: true,
 previewZoom: null,
 uploadComplete: function (res) {
  console.log("uploadComplete", res);
 },
 uploadError: function (err) {
  console.log("uploadError", err);
 },
 onProgress: function (percent) { // 提供给外部获取单个文件的上传进度,供外部实现上传进度效果
  console.log(percent);
 },
 };
 para = $.extend(para, options);

 var $self = $(para.filebutton);
 //先加入一个file元素
 var multiple = ""; // 设置多选的参数
 para.multiple ? multiple = "multiple" : multiple = "";
 $self.css('position', 'relative');
 $self.append('<input id="fileImage" style="opacity:0;position:absolute;top: 0;left: 0;width:100%;height:100%" type="file" size="30" name="fileselect[]" ' + multiple + '>');

var doms = {
 "fileToUpload": $self.parent().find("#fileImage"),
 // "thumb": $self.find(".thumb"),
 // "progress": $self.find(".upload-progress")
 };
 var core = {
 fileSelected: function () {
  var files = (doms.fileToUpload)[0].files;
  var count = files.length;
  console.log("共有" + count + "个文件");
  for (var i = 0; i < count; i++) {
  var item = files[i];
  console.log(item.size);
  if (para.auto) {
  core.uploadFile(item);
  }
  core.previewImage(item);
  }
 },

 uploadFile: function (file) {
  console.log("开始上传");
  var formdata = new FormData();

  formdata.append(para.filebase, file);//这个名字要和mvc后台配合

  var xhr = new XMLHttpRequest();
  xhr.upload.addEventListener("progress", function (e) {

  var percentComplete = Math.round(e.loaded * 100 / e.total);
  para.onProgress(percentComplete.toString() + '%');
  });
  xhr.addEventListener("load", function (e) {
  para.uploadComplete(xhr.responseText);
  });
  xhr.addEventListener("error", function (e) {
  para.uploadError(e);
  });

  xhr.open("post", para.url, true);
  //xhr.setRequestHeader("X_FILENAME", file.name);
  xhr.send(formdata);
 },
 uploadFiles: function () {
  var files = (doms.fileToUpload)[0].files;
  for (var i = 0; i < files.length; i++) {
  core.uploadFile(files[i]);
  }
 },
 previewImage: function (file) {
  if (!para.previewZoom) return;
  var img = document.createElement("img");
  img.file = file;
  $(para.previewZoom).append(img);
  // 使用FileReader方法显示图片内容
  var reader = new FileReader();
  reader.onload = (function (aImg) {
  return function (e) {
  aImg.src = e.target.result;
  };
  })(img);
  reader.readAsDataURL(file);
 }
 }
 doms.fileToUpload.on("change", function () {
 //doms.progress.find("span").width("0");
 console.log("选中了文件");
 core.fileSelected();
 });

 console.log("初始化!");
 //绑定事件

 $(document).on("click", para.filebutton, function () {
 console.log("clicked");
 //doms.fileToUpload.click();
 });
 if (para.uploadButton) {
 $(document).on("click", para.uploadButton, function () {
  core.uploadFiles();
 });
 }
 }
 });
})(Zepto);

简单讲解:上传还是得靠file元素,所以一开始就加了个隐藏的,简单隐藏会有一些问题,有时候不能触发file change事件。所以用了透明度,将父类设置为相对位置。然后通过file的change事件获得需要上传的文件并放入formdata中,再使用xmlHttpRequest发请求。进度条是直接绑定的process事件。文件预览是filereader,另外需要注意的就是filebase参数,对应的是MVC后台上传方法的参数的名称,如果不一致,后台将获取不到file。回调函数就不说了。

[HttpPost]
 public ActionResult MUploadImg(HttpPostedFileBase mfile)
 {
 return UploadImg(mfile, "Mobile");
 }
[HttpPost]
 public ActionResult UploadImg(HttpPostedFileBase file, string dir = "UserImg")
 {
 if (CheckImg(file, imgtypes) != "ok") return Json(new { Success = false, Message = "文件格式不对!" }, JsonRequestBehavior.AllowGet);

 if (file != null)
 {
 var path = "~/Content/UploadFiles/" + dir + "/";
 var uploadpath = Server.MapPath(path);
 if (!Directory.Exists(uploadpath))
 {
  Directory.CreateDirectory(uploadpath);
 }
 string fileName = Path.GetFileName(file.FileName);// 原始文件名称
 string fileExtension = Path.GetExtension(fileName); // 文件扩展名
 //string saveName = Guid.NewGuid() + fileExtension; // 保存文件名称 这是个好方法。
 string saveName = Encrypt.GenerateOrderNumber() + fileExtension; // 保存文件名称 这是个好方法。
 file.SaveAs(uploadpath + saveName);

 return Json(new { Success = true, SaveName = path + saveName });
 }
 return Json(new { Success = false, Message = "请选择要上传的文件!" }, JsonRequestBehavior.AllowGet);

 }

调用:

<div class="page" id="upload">
 <h2>UploadImg</h2>
 <div id="dd" class="filePicker">点击选择文件</div>
 <div id="preview"></div>
</div>
<script>
 $.fileUpload({ filebutton: "#dd", previewZoom: "#preview" });
</script>

扩展到$对象而不扩展到$.fn,是因为zepto中绑定事件的时候后者不方便,传递id或样式名容易绑定。手机端可以自动的调出相机和相册。默认是不预览的图片的,需要制定预览区域,进度条需要自己写样式,只返回了进度值。

同时传2张的效果:

H5手机端多文件上传预览插件

H5手机端多文件上传预览插件

参考了两篇博客:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
一实用的实现table排序的Javascript类库
Sep 12 Javascript
JavaScript 对象的属性和方法4种不同的类型
Mar 19 Javascript
Jquery实现搜索框提示功能示例代码
Aug 13 Javascript
jquery选择器大全 全面详解jquery选择器
Mar 06 Javascript
JS实现动态给图片添加边框的方法
Apr 01 Javascript
高性能JavaScript循环语句和条件语句
Jan 20 Javascript
自动化测试读写64位操作系统的注册表
Aug 15 Javascript
详解Chai.js断言库API中文文档
Jan 31 Javascript
浅谈Angular 观察者模式理解
Nov 01 Javascript
vue学习笔记五:在vue项目里面使用引入公共方法详解
Apr 04 Javascript
Vue+ElementUI项目使用webpack输出MPA的方法
Aug 27 Javascript
Nuxt 项目性能优化调研分析
Nov 07 Javascript
ES6新特性八:async函数用法实例详解
Apr 21 #Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
Apr 21 #Javascript
jquery中$.fn和图片滚动效果实现的必备知识总结
Apr 21 #jQuery
ES6新特性七:数组的扩充详解
Apr 21 #Javascript
React中ES5与ES6写法的区别总结
Apr 21 #Javascript
ES6新特性六:promise对象实例详解
Apr 21 #Javascript
ES6新特性五:Set与Map的数据结构实例分析
Apr 21 #Javascript
You might like
PHP中使用file_get_contents post数据代码例子
2015/02/13 PHP
php生成txt文件实例代码介绍
2016/04/28 PHP
Thinkphp实现站点静态化的方法详解
2017/03/21 PHP
js计数器代码
2006/11/04 Javascript
键盘 keycode的值 javascript时触发事件时很有用的要素
2009/11/02 Javascript
改变隐藏的input中value的值代码
2013/12/30 Javascript
JavaScript对象数组排序实例方法浅析
2016/06/15 Javascript
AngularJs html compiler详解及示例代码
2016/09/01 Javascript
微信小程序 触控事件详细介绍
2016/10/17 Javascript
浅谈JavaScript事件绑定的常用方法及其优缺点分析
2016/11/01 Javascript
vue中mint-ui环境搭建详细介绍
2017/04/06 Javascript
原生JS实现多个小球碰撞反弹效果示例
2018/01/31 Javascript
Vue.directive使用注意(小结)
2018/08/31 Javascript
详解使用jest对vue项目进行单元测试
2018/09/07 Javascript
Layui带搜索的下拉框的使用以及动态数据绑定方法
2019/09/28 Javascript
JS实现简易留言板(节点操作)
2020/03/16 Javascript
vuex中store存储store.commit和store.dispatch的用法
2020/07/24 Javascript
跟老齐学Python之关于类的初步认识
2014/10/11 Python
Python中Random和Math模块学习笔记
2015/05/18 Python
python的unittest测试类代码实例
2017/12/07 Python
如何在django中实现分页功能
2020/04/22 Python
python从Oracle读取数据生成图表
2020/10/14 Python
python利用 keyboard 库记录键盘事件
2020/10/16 Python
matplotlib绘制鼠标的十字光标的实现(自定义方式,官方实例)
2021/01/10 Python
高清屏下canvas重置尺寸引发的问题的解决
2019/10/14 HTML / CSS
荷兰之家英文站:Holland at Home
2016/10/26 全球购物
爱游人:Travelliker
2017/09/05 全球购物
西班牙土拨鼠床垫公司,感觉在云端:Marmota
2019/03/18 全球购物
世界各地的当地人的食物体验:Eatwith
2019/07/26 全球购物
上海雨人软件技术开发有限公司测试题
2015/07/14 面试题
Ruby如何实现动态方法调用
2012/11/18 面试题
2014道德模范事迹材料
2014/02/16 职场文书
爱国卫生月实施方案
2014/02/21 职场文书
销售类求职信
2014/06/13 职场文书
学校捐款活动总结
2015/05/09 职场文书
2016暑期校本培训心得体会
2016/01/08 职场文书