這次分享一個簡易的上傳頭像範例,其大致流程為:
一、將選取的圖片轉為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了,好好欣賞靚照吧!
最後附上完整程式碼,望指教!
友情提示:在複製程式碼測試時請求參數自己加上哦!
photos <script> function preview(file) {//预览图片得到图片base64 var prevDiv = document.getElementById(&#39;preview&#39;); if (file.files && file.files[0]) { var reader = new FileReader(); reader.onload = function(evt){ prevDiv.innerHTML = &#39;<img src="&#39; + evt.target.result + &#39;" />&#39;; } reader.readAsDataURL(file.files[0]); } else { prevDiv.innerHTML = &#39;<div class="img" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale,src=\&#39;&#39; + file.value + &#39;\&#39;"></div>&#39;; } } //以上代码最好写在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>