原生javascript上传图片带进度条【实例分享】


Posted in Javascript onApril 06, 2017

javascript代码:

;
 (function(w) {
 var error = "上传控件不支持您的浏览器!";
 // 构造函数
 function UploadImg(option) {
  $u = this;
  $u.option = option;
  $u.init($u.option);
 }
 UploadImg.prototype = {
  //初始化
  init: function() {
  var $u = this;  
  //template
  $u.addupLoader =
   '<form enctype="multipart/form-data">' +
   '<label style="display:block;width:100%;cursor:pointer;height:100%;position: absolute;">' +
   '<input class="kechenFengMian" type="file" capture="camera" name="file"/>' +
   '</label>' +
   '</form> ' +
   '<img src="" width="280" height="160" />' +
   '<div class="upload-progress"><span class="upload-son">等待中……</span></div>' +
   '<div class="mask-Div">' +
   '<div class="mask-show"></div>' +
   '<div class="button-div">' +
   '<span class="upload-btn"></span>' +
   '<span class="deleteImg-btn"></span></div>' +
   '</div>';
  $u.wrap = $($u.option.el);
  $u._creatFrom();
  $u.eventChange($u.wrap.childNodes);
  },
  //生成form模板
  _creatFrom: function() {
  this.wrap.innerHTML = $u.addupLoader;
  },
  _removeFrom: function() {
  this.wrap.innerHTML = "";
  },
  //事件触发
  /*
  *对于onchange事件若值没有发生改变的话
  *此事件就会失效所以在这里打算将DOM移除
  *直接初始化所有方法和事件
  *
  */
 /**
  *@method (eventChange) 
  *@param {childArr} 参数为数组集合  
  */
  eventChange: function(childArr) {
  var $u = this;
  //提交form表单
  addEvent(childArr[0], 'change', function(e) { 
  //保存当前this对象 
   var thisForm = this;    
   if (!thisForm['file'].files.length == 0) {
   $u._removeFrom();
   $u.init();
   testWidthHeight(e,function(iSsize){
   if(!iSsize){ 
    alert("上传的尺寸为:长为"+$u.option.Max_Width +"宽为"+$u.option.Max_Height); 
    return false; 
    }
    childArr[2].setAttribute('src', "");
    childArr[3].style.display = 'block';
    $u.wrap.style.background = "#f3f3f3";
    //发送post请求
    $u.ajaxPost(thisForm, $u.option.url, function(result) {
    //post成功
    var data = JSON.parse(result);
    $u.maskEvent(childArr);
    childArr[2].setAttribute('src', data.url);
    childArr[3].style.display = 'none';
    }, function(error) {
     //post 失败 
     console.log(error);
    }, childArr);
   });
   } else {  
   alert("上传个数不能为0");  
   return false;
   }
  });
  /**
  *@method (testWidthHeight) 获取上传尺寸大小
  *@param {e} 事件对象
  *@param {callback} 回调函数  
  */
  function testWidthHeight(e,callback) {
  var isSize;
  var forms = e.target;
  var reader = new FileReader();
  reader.onload = function () { 
   var dataURL = reader.result; 
   var image = new Image();
   image.onload=function(){ 
    var width = image.width;
    var height = image.height;
    isSize = width <= $u.option.Max_Width && height <= $u.option.Max_Height; 
    if(typeof callback == 'function') {
    callback(isSize);
    }   
   };  
   image.src = dataURL;
  }; 
  reader.readAsDataURL(forms.files[0]); 
  return isSize; 
  }
  },
  //遮罩层上的是事件
  maskEvent: function(childArr) {
  $u = this;
  var addBtn = childArr[4].childNodes[1].childNodes[0];
  var deleBtn = childArr[4].childNodes[1].childNodes[1];
  //当鼠标滑过
  addEvent($u.wrap, "mouseover", function() {
   if (childArr[2].getAttribute('src')) {
   childArr[4].style.top = 0;
   }
  });
  //当鼠标离开
  addEvent($u.wrap, "mouseout", function() {
   childArr[4].style.top = -300 + 'px';
  });
  //修改
  addEvent(addBtn, 'click', function() {
   childArr[0][0].click();
  });
  //删除
  addEvent(deleBtn, 'click', function() {
   $u.wrap.style.backgroundImage = "url(add-bg-upload1.jpg)";
   childArr[2].setAttribute('src', "");
  });
  },
 /**
 *@method (ajaxPost) 上传方法
 *@param {fm} 当前form表单
 *@param {url} url地址 
 *@param {fnSuc} 成功回调 
 *@param {fnErr} 失败回调 
 *@param {childArr} 节点集合  
 */
  ajaxPost: function(fm, url, fnSuc, fnErr, childArr) {
  var $u = this;
  //进度条
  var proGress = childArr[3].childNodes[0];
  if (window.XMLHttpRequest) {
   var xhr = new XMLHttpRequest();
  } else {
   var xhr = new ActiveXObject("Microsoft.XMLHTTP");
  }
  //data数据 
  var data = new FormData(fm);
  xhr.onreadystatechange = function() {
   if (xhr.readyState == 4) {
   //成功回调
   if (xhr.status == 200) {
    fnSuc(xhr.responseText);
   } else {
    if (fnErr) {
    fnErr(xhr.status);
    }
   }
   }
  };
  //监听上传进度  
  addEvent(xhr.upload, "progress", uploadProgress);
  //post后台
  xhr.open('post', url);
  //发送数据
  xhr.send(data);
  //上传进度
  function uploadProgress(evt) {
   var loaded = evt.loaded; //已上传的文件大小
   var allTotal = evt.total; //总大小
   var per = Math.floor((loaded / allTotal) * 100) + '%';
   proGress.innerHTML = per;
   proGress.style.width = per;
  }
  },
 };
 //获取元素
 function $(selectors) {
  return document.querySelector(selectors);
 }
 //事件监听
 function addEvent(el, type, fn) {
  if (el.addEventListener) {
  el.addEventListener(type, fn, false);
  } else if (el.attachEvent) {
  el.attachEvent('on' + type, function() {
   fn.call(el);
  });
  } else {
  throw new Error('not supported or DOM not loaded');
  }
 }
 //判断浏览器是否存在file属性
 if (window.File && window.FileList) {
  window.UploadImg = UploadImg;
 } else {
 alert(error);
  return false;
 }
 })(window);

PHP代码:

<?php
$file=$_FILES['file'];
foreach ($file as $key => $value) {
 $$key=$value;
}
$path='upload/'.time().strtolower(strstr($name, '.')); //修改上传文件的名称,strstr($name, '.')是获取后缀名
move_uploaded_file($tmp_name,$path);
$path=strstr($path,$path[0]); //图片的存储地址
$arr=array( 
 "url"=>$path
);
$json=json_encode($arr); //json
echo $json;
?>

CSS代码:

.couser-img-upload {
  width:280px;
  height:160px;  
  cursor:pointer;
  position: relative;
  overflow: hidden;
  background:url(add-bg-upload1.jpg);  
 }
 .couser-img-upload:hover{
  border: 2px solid #00caac;
  background:url(add-bg-upload.jpg);
 }
 .kechenFengMian {
  display:none;
 }
 .upload-progress{
  display: none;
  width: 90%;
  position: absolute;  
  overflow: hidden;
  border:1px solid #00caac;
  border-radius: 8px;
  top: 50%;
  margin-top: -7.5px;
  left: 50%;
  padding: 2px;
  margin-left:-46%;
  font-size: 12px;
 }
 .upload-progress .upload-son{
  display: inline-block;
  background: #00caac;
  border-radius: 8px;
  text-align: center;
  color: #fff;
 }
 .mask-Div{
  position: absolute;
  top: -300px;
  width: 100%;
  height: 100%;
 }
 .mask-Div .mask-show{
  position: absolute;
  width: 100%;
  height: 100%;
  background: #000;
  opacity: 0.5;
 }
 .mask-Div .button-div{
  width: 140px;
  height: 50px;
  position: absolute;
  left: 50%;
  top: 50%;
  margin-left: -70px;
  margin-top: -25px;
 }
 .mask-Div .button-div span{
  display: block;
  width: 50px;
  height: 50px;
  border-radius: 50%;
  overflow: hidden;
  background:url(tianjiashanchu.png) no-repeat;
 }
 .mask-Div .button-div span.upload-btn{  
  background-position: 0px 0px;
  float: left;
 }
 .mask-Div .button-div span.deleteImg-btn{
  background:url(tianjiashanchu.png) no-repeat;
  background-position: -50px 0px ;
  float: right;
 }
 .mask-Div .button-div span.upload-btn:hover{
  background-position: 0px -50px ;
 }
 .mask-Div .button-div span.deleteImg-btn:hover{
  background-position: -50px -50px ;
 }

Html代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
  <script type="text/javascript" src="uploadImg.js"></script>
</head>
<body>
<div class="couser-img-upload"></div> 
<script type="text/javascript"> 
  new UploadImg({
    el:".couser-img-upload",
    url:'./upload.php',
    Max_Width:280,
    Max_Height:160
  });
</script>
</body>
</html>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
js no-repeat写法 背景不重复
Mar 18 Javascript
JS自定义功能函数实现动态添加网址参数修改网址参数值
Aug 02 Javascript
JavaScript 语言基础知识点总结(思维导图)
Nov 10 Javascript
影响jQuery使用的14个方面
Sep 01 Javascript
JavaScript数组方法总结分析
May 06 Javascript
Javascript中for循环语句的几种写法总结对比
Jan 23 Javascript
Bootstrap模态框插件使用详解
May 11 Javascript
基于jquery实现多选下拉列表
Aug 02 jQuery
解析Json字符串的三种方法日常常用
May 02 Javascript
vue.js实现格式化时间并每秒更新显示功能示例
Jul 07 Javascript
详解Vue的列表渲染
Nov 20 Vue.js
解决vue自定义组件@click点击失效问题
Apr 30 Vue.js
jQuery实现文章图片弹出放大效果
Apr 06 #jQuery
vue.js指令和组件详细介绍及实例
Apr 06 #Javascript
javascript闭包功能与用法实例分析
Apr 06 #Javascript
深入理解 JavaScript 中的 JSON
Apr 06 #Javascript
ES6中module模块化开发实例浅析
Apr 06 #Javascript
ES6中class类用法实例浅析
Apr 06 #Javascript
ES6中Proxy代理用法实例浅析
Apr 06 #Javascript
You might like
PHP4实际应用经验篇(1)
2006/10/09 PHP
火车头discuz6.1 完美采集的php接口文件
2009/09/13 PHP
ThinkPHP中的系统常量和预定义常量集合
2014/07/01 PHP
php删除文本文件中重复行的方法
2015/04/28 PHP
smarty高级特性之过滤器的使用方法
2015/12/25 PHP
Javascript优化技巧(文件瘦身篇)
2008/01/28 Javascript
jquery 表格的增行删行实现思路
2013/03/21 Javascript
JS实现的不规则TAB选项卡效果代码
2015/09/18 Javascript
基于JavaScript实现生成名片、链接等二维码
2015/09/20 Javascript
AngularJS转换响应内容
2016/01/27 Javascript
Javascript数组Array基础介绍
2016/03/13 Javascript
AngularJs 60分钟入门基础教程
2016/04/03 Javascript
学习使用jQuery表单验证插件和日历插件
2017/02/13 Javascript
详解angularjs中的隔离作用域理解以及绑定策略
2017/05/31 Javascript
JS实现websocket长轮询实时消息提示的效果
2017/10/10 Javascript
Vue不能检测到Object/Array更新的情况的解决
2018/06/26 Javascript
JavaScript数组去重的几种方法
2019/04/07 Javascript
JS实现动态无缝轮播
2020/01/11 Javascript
微信小程序仿抖音短视频切换效果的实例代码
2020/06/24 Javascript
[02:37]2018DOTA2亚洲邀请赛赛前采访-EG篇
2018/04/03 DOTA
PYTHON正则表达式 re模块使用说明
2011/05/19 Python
探究数组排序提升Python程序的循环的运行效率的原因
2015/04/01 Python
Python计算已经过去多少个周末的方法
2015/07/25 Python
Python 基于Twisted框架的文件夹网络传输源码
2016/08/28 Python
python 生成器生成杨辉三角的方法(必看)
2017/04/10 Python
python在新的图片窗口显示图片(图像)的方法
2019/07/11 Python
浅析python redis的连接及相关操作
2019/11/07 Python
python 实现百度网盘非会员上传超过500个文件的方法
2021/01/07 Python
美国波西米亚风格精品店:South Moon Under
2019/10/26 全球购物
提高EJB性能都有哪些技巧
2012/03/25 面试题
幼儿园教师个人反思
2014/01/30 职场文书
马丁路德金演讲稿
2014/05/19 职场文书
2014年变电站工作总结
2014/12/19 职场文书
优秀学生干部事迹材料
2014/12/24 职场文书
管理人员岗位职责
2015/02/14 职场文书
JS前端使用canvas实现物体的点选示例
2022/08/05 Javascript