js實(shí)現(xiàn)把圖片的絕對(duì)路徑轉(zhuǎn)為base64字符串、blob對(duì)象再上傳
主題:
JavaScript把項(xiàng)目本地的圖片或者圖片的絕對(duì)路徑轉(zhuǎn)為base64字符串、blob對(duì)象在上傳。
用處:
從本地選擇圖片上傳,如項(xiàng)目規(guī)定只能選擇本項(xiàng)目文件夾下的圖像上傳為頭像等。
主要思想:
使用canvas.toDataURL()方法將圖片的絕對(duì)路徑轉(zhuǎn)換為base64編碼.
具體用法:
在這我們引用淘寶服務(wù)器上的一張圖片舉例:
var imgSrc = "https://img.alicdn.com/bao/uploaded/TB1qimQIpXXXXXbXFXXSutbFXXX.jpg"; // var imgSrc = "img/1.jpg"; function getBase64(img){//傳入圖片路徑,返回base64 function getBase64Image(img,width,height) {//width、height調(diào)用時(shí)傳入具體像素值,控制大小 ,不傳則默認(rèn)圖像大小 var canvas = document.createElement("canvas"); canvas.width = width ? width : img.width; canvas.height = height ? height : img.height; var ctx = canvas.getContext("2d"); ctx.drawImage(img, 0, 0, canvas.width, canvas.height); var dataURL = canvas.toDataURL(); return dataURL; } var image = new Image(); image.src = img; var deferred=$.Deferred(); if(img){ image.onload =function (){ deferred.resolve(getBase64Image(image));//將base64傳給done上傳處理 } return deferred.promise();//問題要讓onload完成后再return sessionStorage['imgTest'] } } getBase64(imgSrc) .then(function(base64){ console.log(base64); },function(err){ console.log(err); });
此時(shí)在chrome測試,運(yùn)行時(shí)會(huì)報(bào)錯(cuò)!
原因:
我們使用的是淘寶服務(wù)器上的圖片,在本地服務(wù)器下訪問,結(jié)果出現(xiàn)圖片跨域的問題。
處理方案:
一、將圖片放在本地服務(wù)器
var imgSrc = "img/1.jpg";//本地項(xiàng)目文件夾下的圖片 function getBase64(img){//傳入圖片路徑,返回base64 function getBase64Image(img,width,height) { var canvas = document.createElement("canvas"); canvas.width = width ? width : img.width; canvas.height = height ? height : img.height; var ctx = canvas.getContext("2d"); ctx.drawImage(img, 0, 0, canvas.width, canvas.height); var dataURL = canvas.toDataURL(); return dataURL; } var image = new Image(); image.src = img; var deferred=$.Deferred(); if(img){ image.onload =function (){ deferred.resolve(getBase64Image(image));//將base64傳給done上傳處理 } return deferred.promise();//問題要讓onload完成后再return sessionStorage['imgTest'] } } getBase64(imgSrc) .then(function(base64){ console.log(base64); },function(err){ console.log(err); });
二、 跨域
想引用其他服務(wù)器下的圖片該如何解決呢?
我們可以使用下面這一句代碼解決跨域。
image.crossOrigin = '';
測試在chrome和firefox,ie9+下生效,在目前safari6以下貌似不支持。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>nick getBase64</title> </head> <body> <div><img id="test" src="" alt=""/></div> <script src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js"></script> <script> var imgSrc = "https://img.alicdn.com/bao/uploaded/TB1qimQIpXXXXXbXFXXSutbFXXX.jpg"; // var imgSrc = "img/1.jpg"; function getBase64(img){//傳入圖片路徑,返回base64 function getBase64Image(img,width,height) {//width、height調(diào)用時(shí)傳入具體像素值,控制大小 ,不傳則默認(rèn)圖像大小 var canvas = document.createElement("canvas"); canvas.width = width ? width : img.width; canvas.height = height ? height : img.height; var ctx = canvas.getContext("2d"); ctx.drawImage(img, 0, 0, canvas.width, canvas.height); var dataURL = canvas.toDataURL(); return dataURL; } var image = new Image(); image.crossOrigin = ''; image.src = img; var deferred=$.Deferred(); if(img){ image.onload =function (){ deferred.resolve(getBase64Image(image));//將base64傳給done上傳處理 } return deferred.promise();//問題要讓onload完成后再return sessionStorage['imgTest'] } } getBase64(imgSrc) .then(function(base64){ console.log(base64); },function(err){ console.log(err); }); </script> </body> </html>
上面是本功能的完整代碼,親們,可以測試咯!
這樣就本地圖片和其他服務(wù)器上的圖片都可以處理了!
結(jié)語:
想要了解更多的有關(guān)上傳頭像功能,可參考《淺析上傳頭像示例及其注意事項(xiàng)》
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
在一個(gè)js文件里遠(yuǎn)程調(diào)用jquery.js會(huì)在ie8下的一個(gè)奇怪問題
這樣的腳本你在ie8下調(diào)用,在ie8地址欄下按下回車后調(diào)用jquery的對(duì)像、方法什么的沒有問題,但是刷新之后就有問題。就是刷新之后無論怎樣你要在地址欄按一下回車。2010-11-11html+js實(shí)現(xiàn)簡單的計(jì)算器代碼(加減乘除)
下面小編就為大家?guī)硪黄猦tml+js實(shí)現(xiàn)簡單的計(jì)算器代碼(加減乘除)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-07-07一個(gè)可以隨意添加多個(gè)序列的tag函數(shù)
由于在沒有規(guī)劃好的情況下寫的這個(gè)代碼,寫的比較粗糙,也沒有添加注釋。 JavaScript代碼和HTML完全分離;可以隨意添加多個(gè)子div標(biāo)簽,自動(dòng)擴(kuò)展2009-07-07JavaScript必知必會(huì)(十) call apply bind的用法說明
這篇文章主要介紹了JavaScript必知必會(huì)(十) call apply bind的用法說明 的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06Bootstrap禁用響應(yīng)式布局的實(shí)現(xiàn)方法
這篇文章主要介紹了Bootstrap禁用響應(yīng)式布局的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03JavaScript基于ChatGPT實(shí)現(xiàn)打字機(jī)消息回復(fù)
ChatGPT 是一個(gè)基于深度學(xué)習(xí)的大型語言模型,處理自然語言需要大量的計(jì)算資源和時(shí)間,響應(yīng)速度肯定比普通的讀數(shù)據(jù)庫要慢的多,本文介紹了ChatGPT打字機(jī)消息回復(fù)實(shí)現(xiàn)原理,感興趣的同學(xué)可以跟著小編一起學(xué)習(xí)2023-05-05