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 相关文章推荐
Google Map Api和GOOGLE Search Api整合实现代码
Jul 18 Javascript
解决jquery .ajax 在IE下卡死问题的解决方法
Oct 26 Javascript
jQuery获取CSS样式中的颜色值的问题,不同浏览器格式不同的解决办法
May 13 Javascript
JQuery和PHP结合实现动态进度条上传显示
Nov 23 Javascript
jQuery时间日期三级联动(推荐)
Nov 27 Javascript
Vee-Validate的使用方法详解
Sep 22 Javascript
Vue render深入开发讲解
Apr 13 Javascript
JavaScript引用类型Array实例分析
Jul 24 Javascript
微信小程序chooseImage的用法(从本地相册选择图片或使用相机拍照)
Aug 22 Javascript
jQuery实现左右两个列表框的内容相互移动功能示例
Jan 27 jQuery
浅谈发布订阅模式与观察者模式
Apr 09 Javascript
vue中el-input绑定键盘按键(按键修饰符)
Jul 22 Javascript
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
php开启安全模式后禁用的函数集合
2011/06/26 PHP
php ImageMagick windows下安装教程
2015/01/26 PHP
深入理解JavaScript系列(43):设计模式之状态模式详解
2015/03/04 Javascript
JavaScript获取网页支持表单字符集的方法
2015/04/02 Javascript
基于vue实现分页/翻页组件paginator示例
2017/03/09 Javascript
node安装--linux下的快速安装教程
2017/03/21 Javascript
jQuery UI Grid 模态框中的表格实例代码
2017/04/01 jQuery
微信小程序动态的加载数据实例代码
2017/04/14 Javascript
js实现多张图片延迟加载效果
2017/07/17 Javascript
js使用highlight.js高亮你的代码
2017/08/18 Javascript
JS中获取 DOM 元素的绝对位置实例详解
2018/04/23 Javascript
vue服务端渲染添加缓存的方法
2018/09/18 Javascript
element实现合并单元格通用方法
2019/11/13 Javascript
JS函数进阶之继承用法实例分析
2020/01/15 Javascript
浅析Vue 中的 render 函数
2020/02/28 Javascript
[01:31:22]Ti4 循环赛第四日附加赛LGD vs Mouz
2014/07/13 DOTA
[38:40]2018DOTA2亚洲邀请赛 4.6淘汰赛 mineski vs LGD 第一场
2018/04/10 DOTA
Python使用百度API上传文件到百度网盘代码分享
2014/11/08 Python
搭建Python的Django框架环境并建立和运行第一个App的教程
2016/07/02 Python
Python中最大最小赋值小技巧(分享)
2017/12/23 Python
python 保存float类型的小数的位数方法
2018/10/17 Python
Python3.5多进程原理与用法实例分析
2019/04/05 Python
使用python制作一个为hex文件增加版本号的脚本实例
2019/06/12 Python
python for和else语句趣谈
2019/07/02 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
2020/01/07 Python
Python中如何添加自定义模块
2020/06/09 Python
贪睡宠物用品:Snoozer Pet Products
2020/02/04 全球购物
现代化办公人员工作的自我评价
2013/10/16 职场文书
医学院护理专业应届生求职信
2013/11/12 职场文书
创建学习型党组织实施方案
2014/03/29 职场文书
2015年档案管理员工作总结
2015/05/13 职场文书
2015年医务科工作总结范文
2015/05/26 职场文书
美容院管理规章制度
2015/08/05 职场文书
素质教育学习心得体会
2016/01/19 职场文书
三种方式清除vue路由跳转router-link的历史记录
2022/04/10 Vue.js
MySQL分布式恢复进阶
2022/07/23 MySQL