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 相关文章推荐
解读IE和firefox下JScript和HREF的执行顺序
Jan 12 Javascript
来自chinaz的ajax获取评论代码
May 03 Javascript
jquery 插件开发方法小结
Oct 23 Javascript
javascript顺序加载图片的方法
Jul 18 Javascript
JS脚本实现动态给标签控件添加事件的方法
Jun 02 Javascript
jquery插件autocomplete用法示例
Jul 01 Javascript
原生Javascript和jQuery做轮播图简单例子
Oct 11 Javascript
EasyUI的DataGrid每行数据添加操作按钮的实现代码
Aug 22 Javascript
AngularJS实现与后台服务器进行交互的示例讲解
Aug 13 Javascript
详解微信UnionID作用
May 15 Javascript
JS浏览器BOM常见操作实例详解
Apr 27 Javascript
基于JavaScript实现随机点名器
Feb 25 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 Trait代码复用类与多继承实现方法详解
2019/06/17 PHP
window.open()弹出居中的窗口
2007/02/01 Javascript
javascript 进阶篇1 正则表达式,cookie管理,userData
2012/03/14 Javascript
JavaScript中的稀疏数组与密集数组[译]
2012/09/17 Javascript
js导入导出excel(实例代码)
2013/11/25 Javascript
jQuery实现下拉框左右选择的简单实例
2014/02/22 Javascript
jQuery的缓存机制浅析
2014/06/07 Javascript
js简单的点击返回顶部效果实现方法
2015/04/10 Javascript
jQuery实现可用于博客的动态滑动菜单完整实例
2015/09/17 Javascript
js 性能优化之算法和流程控制
2017/02/15 Javascript
react-router实现跳转传值的方法示例
2017/05/27 Javascript
hammer.js实现图片手势放大效果
2017/08/29 Javascript
JavaScript图片处理与合成总结
2018/03/04 Javascript
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
2018/03/22 Javascript
nodejs 简单实现动态html的方法
2018/05/12 NodeJs
Babel 入门教程学习笔记
2018/06/13 Javascript
Vue CL3 配置路径别名详解
2019/05/30 Javascript
layui--js控制switch的切换方法
2019/09/03 Javascript
过滤器vue.filters的使用方法实现
2019/09/18 Javascript
微信小程序录音实现功能并上传(使用node解析接收)
2020/02/26 Javascript
Python功能点实现:函数级/代码块级计时器
2019/01/02 Python
pycharm远程开发项目的实现步骤
2019/01/20 Python
python3.5 cv2 获取视频特定帧生成jpg图片
2019/08/28 Python
基于Django统计博客文章阅读量
2019/10/29 Python
python 协程 gevent原理与用法分析
2019/11/22 Python
python3 logging日志封装实例
2020/04/08 Python
keras实现多GPU或指定GPU的使用介绍
2020/06/17 Python
银行会计财务工作个人的自我评价
2013/10/29 职场文书
大学生求职推荐信
2013/11/27 职场文书
体育专业个人求职信范文
2013/12/27 职场文书
项目考察欢迎辞
2014/01/17 职场文书
英文自荐信常用句子
2014/03/26 职场文书
爱岗敬业演讲稿
2014/05/05 职场文书
杭州西湖英语导游词
2015/02/03 职场文书
西部计划志愿者工作总结
2015/08/11 职场文书
Android基础入门之dataBinding的简单使用教程
2022/06/21 Java/Android