这次分享一个简易的上传头像示例,其大致流程为:
一、将选择的图片转为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="/UploadFiles/2021-04-02/' + evt.target.result + '">上面的方法可将选择的图片转为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; 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="/UploadFiles/2021-04-02/jquery.min.js">更多精彩内容请参考专题《ajax上传技术汇总》,《javascript文件上传操作汇总》和《jQuery上传操作汇总》进行学习。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
js,upload,上传头像
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?