这里有新鲜出炉的 Javascript 教程,程序狗速度看过来!
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
本文主要介绍了 JavaScript 把项目本地的图片或者图片的绝对路径转为 base64 字符串、blob 对象再上传的方法,具有一定的参考价值,需要的朋友一起来看下吧
主题:
JavaScript 把项目本地的图片或者图片的绝对路径转为 base64 字符串、blob 对象在上传。
用处:
从本地选择图片上传,如项目规定只能选择本项目文件夹下的图像上传为头像等。
主要思想:
使用 canvas.toDataURL() 方法将图片的绝对路径转换为 base64 编码.
具体用法:
在这我们引用淘宝服务器上的一张图片举例:
- 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调用时传入具体像素值,控制大小 ,不传则默认图像大小
- 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);
- });
此时在 chrome 测试,运行时会报错!
原因:
我们使用的是淘宝服务器上的图片,在本地服务器下访问,结果出现图片跨域的问题。
处理方案:
一、将图片放在本地服务器
- var imgSrc = "img/1.jpg";//本地项目文件夹下的图片
- 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);
- });
二、 跨域
想引用其他服务器下的图片该如何解决呢?
我们可以使用下面这一句代码解决跨域。
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调用时传入具体像素值,控制大小 ,不传则默认图像大小
- 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>
上面是本功能的完整代码,亲们,可以测试咯!
这样就本地图片和其他服务器上的图片都可以处理了!
结语:
想要了解更多的有关上传头像功能,可参考《浅析上传头像示例及其注意事项》
来源: http://www.phperz.com/article/17/0526/329019.html