信息发布→ 登录 注册 退出

vue 图片转base64本地路径跨域方式

发布时间:2026-01-11

点击量:
目录
  • 图片转base64本地路径跨域
    • 问题描述
    • 解决方案
  • 图片转成base64跨域等安全限制及解决

    图片转base64本地路径跨域

    问题描述

    代码

    getUrlBase64(url, ext, callback) {
                        var canvas = document.createElement("canvas");   //创建canvas DOM元素
                    var ctx = canvas.getContext("2d");
                    var img = new Image;
                    img.crossOrigin = 'Anonymous';//外网访问必须加否则会报错
                    img.src = url;
                    img.onload = function () {
                        canvas.height = 140; //指定画板的高度,自定义
                        canvas.width = 120; //指定画板的宽度,自定义
                        ctx.drawImage(img, 0, 0, 140, 120); //参数可自定义 高度,宽度
                        var dataURL = canvas.toDataURL("image/" + ext);
                        callback.call(this, dataURL); //回掉函数获取Base64编码
                        canvas = null;
                    }; 
                },

    解决方案

    1、采用nginx 进行监听端口进行转发

    resPre:'http://localhost:8083/fileApi'
    server{
            listen       8083;
            server_name  localhost 192.168.0.13;
            root   "路径";
            # 该字段是必须的。它的值要么是请求时Origin字段的值,要么是一个*,表示接受任意域名的请求。
            add_header 'Access-Control-Allow-Origin' '*';
            # 该字段可选。它的值是一个布尔值,表示是否允许发送Cookie。
            #  默认情况下,Cookie不包括在CORS请求之中。设为true,即表示服务器明确许可,
            #  Cookie可以包含在请求中,一起发给服务器。这个值也只能设为true,
            #  如果服务器不要浏览器发送Cookie,删除该字段即可
            add_header 'Access-Control-Allow-Credentials' 'true';
            # 该字段是必须的,用来列出浏览器的CORS请求会用到哪些HTTP方法,上例是PUT。
            add_header 'Access-Control-Allow-Methods' '*';
     
            #end 允许指定域名跨域访问,根据自己情况修改
            #ssl配置省略
             location / {
                rewrite  ^.+fileApi/?(.*)$ /$1 break;//fileApi 前缀
                proxy_pass  http://localhost:8085;    #node api server 即需要代理的IP地址
                proxy_redirect off;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             }        
        }

    2、把图片放在项目目录下面,也就是同一个地址下面。 

    图片转成base64跨域等安全限制及解决

    把其他域的图片在canvas中转换为base64时,会遇到跨域安全限制。

    目前,唯一可行的方案是,把图片文件以arraybuffer的形式ajax下载下来,然后直接转base4。

    但是,这样有个毛病,就是可能会浪费带宽,多下载一次。

    /*    var getBase64ByUrl = function(src, callback, outputFormat) {
            var canvas = document.createElement('canvas'),
                ctx = canvas.getContext('2d'),
                img = new Image;
            img.crossOrigin = 'Anonymous';
            img.onload = function() {
                canvas.height = img.height;
                canvas.width = img.width;
                ctx.drawImage(img, 0, 0); //默认图片文件的原始size 缩小base串需加第4、5个参数
                alert(5)
                try{
    var dataURL = canvas.toDataURL(outputFormat || 'image/png');
                } catch(e) { alert(e.name + ": " + e.message);
                    alert(JSON.stringify(e));
                }
                dataURL =dataURL.replace("data:image/png;base64,", "");
                //dataURL =encodeURIComponent(dataURL);
                alert(dataURL);
                callback(dataURL);
                canvas = null;
            };
            img.src = src;alert(6.5)
        }*/
    var getBase64ByUrl = function(src, callback, outputFormat) {
          var xhr = new XMLHttpRequest();
          xhr.open('GET', src, true);
          xhr.responseType = 'arraybuffer';
          xhr.onload = function(e) {
            if (xhr.status == 200) {
              var uInt8Array = new Uint8Array(xhr.response);
              var i = uInt8Array.length;
              var binaryString = new Array(i);
              while (i--) {
                binaryString[i] = String.fromCharCode(uInt8Array[i]);
              }
              var data = binaryString.join('');
              var base64 = window.btoa(data);
              var dataUrl = "data:" + (outputFormat || "image/png") + ";base64," + base64;
              alert(dataUrl)
              callback.call(this, dataUrl);
            }
          };
          xhr.send();
        }

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

    在线客服
    服务热线

    服务热线

    4008888355

    微信咨询
    二维码
    返回顶部
    ×二维码

    截屏,微信识别二维码

    打开微信

    微信号已复制,请打开微信添加咨询详情!