浅析上传头像示例及其注意事项

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

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

rush:js;"> 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 = ''; } reader.readAsDataURL(file.files[0]); } else { prevDiv.innerHTML = '
aimageLoader(sizingMethod=scale,src=\'' + file.value + '\'">
'; } }

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

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

rush:js;"> 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内。

三、第一次请求

rush:js;"> $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,status1); }) }

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

四、第二次请求

rush:js;"> $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,status2); });

注意:

  • 此时请求的url是第一次请求返回的一个固定地址(我这里是--data.UrlForPut)。
  • 头部信息处避免阿里云上传时报错写成'Content-Type':' '或者根据阿里云要求上传header。
  • 第二次请求成功后图片的地址是第一次返回的该图像的地址(此处是个大坑,data.Url不要写成data2.Url了)。

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

最后附上完整代码,望指教!

友情提示:在测试时请求参数自己加上哦!

rush:js;"> Meta charset="UTF-8"> <Meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1"> photos
选择文件

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...