web前端开发upload上传头像js示例代码


Posted in Javascript onOctober 22, 2016

这次分享一个简易的上传头像示例,其大致流程为:

一、将选择的图片转为base64字符串

function preview(file) {//预览图片得到图片base64
  var prevDiv = document.getElementById('preview');
  if (file.files && file.files[0]) {
   var reader = new FileReader();
   reader.onload = function(evt){
    prevDiv.innerHTML = '<img src="' + evt.target.result + '" />';
   }
   reader.readAsDataURL(file.files[0]);
  } else {
   prevDiv.innerHTML = '<div class="img" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale,src=\'' + file.value + '\'"></div>';
  }
 }

上面的方法可将选择的图片转为base64预览,此时可以打桩看看base64到底是什么东东。

二、根据(阿里云)上传要求,对该图像base64去头等处理

var binaryblob = function (s, type) {//blob对象
     var byteString = atob(s);
     var array = [];
     for (var i = 0; i < byteString.length; i++) {
      array.push(byteString.charCodeAt(i));
     }
     return new Blob([new Int8Array(array)], {type: type});
    };
var binaryPictureBlob = function (dataUrl, filterHead) {//上传base64去头
     var s = filterHead ? dataUrl.replace(/^data:image\/(png|jpeg|pjpeg|bmp|gif|x-png);base64,/, "") : dataUrl;
     return binaryblob(s, "image/jpeg");
    };

此时将base64去头等处理后返回一个blob对象用于上传阿里云。以上方法最好写在service、factory里,以后有图像上传需求时方便直接调用,尽量不要写在controller内。

三、第一次请求

$scope.save=function(){//保存
 var pic=binaryPictureBlob($('#preview img').attr('src'),true);//调用该方法得到上传数据
 console.log(pic);
 $http({//接口参数
  url:'',
  method:'',
  headers:{},
  data:{}
 }).success(function(data){
  console.log(data);


//这里讲进行第二次请求
 }).error(function(err1,header1,config1,status1){//处理响应失败
  console.log(err1,header1,config1,status1);
 })
}

点击保存按钮后第一次请求是上传到本地服务器,实际是上传一些该图像的标记等信息。上传成功后会返回一个该图像对应的阿里云地址和一个阿里云上传图像的地址,此时该图像地址暂不可用。

四、第二次请求

$http({
 method:'PUT',
 url:data.UrlForPut,
 headers: {
  'Content-Type':' ',
 },
 data:pic//图像base64字符串去头等处理后的图片信息blob
}).success(function(data2){
 $scope.imgSrc=data.Url;//将服务器的数据的url赋值图片链接
}).error(function(err2,header2,config2,status2){//处理响应失败
 console.log(err2,header2,config2,status2);
});

注意:

此时请求的url是第一次请求返回的一个固定地址(我这里是--data.UrlForPut)。

头部信息处避免阿里云上传时报错写成'Content-Type':' '或者根据阿里云要求上传header。

第二次请求成功后图片的地址是第一次返回的该图像的地址(此处是个大坑,data.Url不要写成data2.Url了)。

五、此时应该都ok了,好好欣赏靓照吧!

最后附上完整代码,望指教!
友情提示:在复制代码测试时请求参数自己加上哦!

<!DOCTYPE html>
<html ng-app="webPhotos">
<head lang="zh-CN">
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
 <title>photos</title>
 <style>
  div{text-align:center;border:1px solid #ddd;}
  button,div{margin:10px auto}
  button{border:0;width:200px;height:30px;line-height:30px;font-size:1pc;color:#333;background-color:#0ff;cursor:pointer;border-radius:5px}
  button:hover{background-color:#db7093}
  #preview,.show-img{width:200px;height:200px;}
  #preview img,.show-img img{width:100%;height:100%;}
  .file{position:relative;display:block;width:200px;height:30px;line-height:30px;background:#9acd32;border-radius:5px;margin:10px auto;overflow:hidden;color:#1e88c7;text-decoration:none;text-indent:0}
  .file input{position:absolute;font-size:75pt;right:0;top:0;opacity:0}
  .file:hover{background:#aadffd;border-color:#78c3f3;color:#004974;text-decoration:none}
 </style>
</head>
<body>
<div ng-controller="photos">
 <a href="javascript:;" class="file">
  <span>选择文件</span>
  <input type="file" onchange="preview(this)" />
 </a>
 <button class="save" ng-click="save()">保存</button>
 <h2>头像预览</h2>
 <div id="preview"></div>
 <h2>上传成功后展示头像</h2>
 <div class="show-img">
  <img ng-src={{imgSrc}} alt=""/>
 </div>
</div>
<script type="text/javascript" src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
<script>
 function preview(file) {//预览图片得到图片base64
  var prevDiv = document.getElementById('preview');
  if (file.files && file.files[0]) {
   var reader = new FileReader();
   reader.onload = function(evt){
    prevDiv.innerHTML = '<img src="' + evt.target.result + '" />';
   }
   reader.readAsDataURL(file.files[0]);
  } else {
   prevDiv.innerHTML = '<div class="img" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale,src=\'' + file.value + '\'"></div>';
  }
 }
 //以上代码最好写在service或factory里
 angular.module('webPhotos',['ng'])
   .controller('photos',function($scope,$http){
    var binaryblob = function (s, type) {//blob对象
     var byteString = atob(s);
     var array = [];
     for (var i = 0; i < byteString.length; i++) {
      array.push(byteString.charCodeAt(i));
     }
     return new Blob([new Int8Array(array)], {type: type});
    };
    var binaryPictureBlob = function (dataUrl, filterHead) {//上传base64去头
     var s = filterHead ? dataUrl.replace(/^data:image\/(png|jpeg|pjpeg|bmp|gif|x-png);base64,/, "") : dataUrl;
     return binaryblob(s, "image/jpeg");
    };

    $scope.save=function(){//保存
     var pic=binaryPictureBlob($('#preview img').attr('src'),true);//调用该方法得到上传数据
     $http({//接口参数
      url:'',
      method:'',
      headers:{},
      data:{}
     }).success(function(data){//此时上传到本地服务器成功,实际上只是上传了与此图片有关的标记,图片信息还未上传
      $http({
       method:'PUT',
       url:data.UrlForPut,//上传到本地服务器已经生成地址,但要上传到阿里云后地址才生效有上传的图像显示
       headers: {
        'Content-Type':' ',//避免阿里云上传时报错或者根据阿里云要求上传header
       },
       data:pic//图像base64字符串去头等处理后的图片信息
      }).success(function(data2){//将图像信息从服务器上传到阿里云
       $scope.imgSrc=data.Url;//将服务器的数据的url赋值图片链接
      }).error(function(err2,header2,config2,status2){//处理响应失败
       console.log(err2,header2,config2,status2);
      });
     }).error(function(err1,header1,config1,status1){//处理响应失败
      console.log(err1,header1,config1,status1);
     })
    }
   })
</script>
</body>
</html>

更多精彩内容请参考专题《ajax上传技术汇总》,《javascript文件上传操作汇总》和《jQuery上传操作汇总》进行学习。

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

Javascript 相关文章推荐
jQuery获取iframe的document对象的方法
Oct 10 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
Nov 30 Javascript
深入浅析JS是按值传递还是按引用传递(推荐)
Sep 18 Javascript
AngularJS中update两次出现$promise属性无法识别的解决方法
Jan 05 Javascript
SpringMVC+bootstrap table实例详解
Jun 02 Javascript
原JS实现banner图的常用功能
Jun 12 Javascript
AngularJS自定义指令详解(有分页插件代码)
Jun 12 Javascript
微信小程序顶部可滚动导航效果
Oct 31 Javascript
vue内置组件transition简单原理图文详解(小结)
Jul 12 Javascript
vue全屏事件开发详解
Jun 17 Javascript
原生js实现随机点名
Jul 05 Javascript
vue登录页实现使用cookie记住7天密码功能的方法
Feb 18 Vue.js
jQuery中$.ajax()方法参数解析
Oct 22 #Javascript
详解Javascript函数声明与递归调用
Oct 22 #Javascript
js中利用cookie实现记住密码功能
Aug 20 #Javascript
JavaScript实现页面无操作倒计时退出
Oct 22 #Javascript
微信开发 消息推送实现代码
Oct 21 #Javascript
微信和qq时间格式模板实例详解
Oct 21 #Javascript
微信开发 微信授权详解
Oct 21 #Javascript
You might like
javascript中interval与setTimeOut的区别示例介绍
2014/03/14 Javascript
举例说明JavaScript中的实例对象与原型对象
2016/03/11 Javascript
javascript HTML5 Canvas实现圆盘抽奖功能
2016/04/11 Javascript
Java框架SSH结合Easyui控件实现省市县三级联动示例解析
2016/06/12 Javascript
EasyUI创建对话框的两种方式
2016/08/23 Javascript
jquery根据一个值来选中select下的option实例代码
2016/08/29 Javascript
利用Vue v-model实现一个自定义的表单组件
2017/04/27 Javascript
Angular4编程之表单响应功能示例
2017/12/13 Javascript
angular将html代码输出为内容的实例
2018/09/30 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
2019/05/26 Javascript
浅谈一种让小程序支持JSX语法的新思路
2019/06/16 Javascript
解决echarts 一条柱状图显示两个值,类似进度条的问题
2020/07/20 Javascript
Vue使用Proxy代理后仍无法生效的解决
2020/11/13 Javascript
Vue实现简易购物车页面
2020/12/30 Vue.js
python采用django框架实现支付宝即时到帐接口
2016/05/17 Python
Python数据结构与算法之使用队列解决小猫钓鱼问题
2017/12/14 Python
python中(str,list,tuple)基础知识汇总
2018/02/20 Python
Python数据结构之图的应用示例
2018/05/11 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
2019/07/07 Python
Spring Cloud Feign高级应用实例详解
2019/12/10 Python
python设置环境变量的作用整理
2020/02/17 Python
Python实现在Windows平台修改文件属性
2020/03/05 Python
基于matplotlib xticks用法详解
2020/04/16 Python
一篇文章搞懂python的转义字符及用法
2020/09/03 Python
东方电视购物:东方CJ
2016/10/12 全球购物
澳洲CFL商城:CHEMIST FOR LESS(中文)
2021/02/28 全球购物
UNIX文件名称有什么规定
2013/03/25 面试题
网站编辑求职信
2013/10/17 职场文书
安全标准化汇报材料
2014/02/03 职场文书
公司开业庆典主持词
2014/03/21 职场文书
2014乡镇机关党员个人对照检查材料思想汇报
2014/10/09 职场文书
党员个人年度总结
2015/02/14 职场文书
2015年万圣节活动总结
2015/03/24 职场文书
药品销售员2015年终工作总结
2015/10/22 职场文书
如何用JavaScript学习算法复杂度
2021/04/30 Javascript
浅谈Golang 切片(slice)扩容机制的原理
2021/06/09 Golang