视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
web前端开发upload上传头像js示例代码
2020-11-27 20:28:37 责编:小采
文档


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

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

function preview(file) {//预览图片得到图片base
 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>';
 }
 }

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

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

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) {//上传base去头
 var s = filterHead ? dataUrl.replace(/^data:image\/(png|jpeg|pjpeg|bmp|gif|x-png);base,/, "") : dataUrl;
 return binaryblob(s, "image/jpeg");
 };

此时将base去头等处理后返回一个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//图像base字符串去头等处理后的图片信息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) {//预览图片得到图片base
 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) {//上传base去头
 var s = filterHead ? dataUrl.replace(/^data:image\/(png|jpeg|pjpeg|bmp|gif|x-png);base,/, "") : 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//图像base字符串去头等处理后的图片信息
 }).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>

下载本文
显示全文
专题