JS在浏览器中base64、url、blob互相转换_AndyQsmart的博客-程序员秘密

技术标签: JavaScript  

公众号:程序员波波

在平时开发的时候,我们在处理文件,尤其是图片的时候,经常会跟base64、url、blob(file)这三种形式的内容打交道。

base64格式一般都是以data:image/jpeg;base64,这种类似形式打头的一串很长的字符串。

url一般以服务器地址或者路径(形如http://xxx.jpg或者/static/xxx.jpg)为主,也会有浏览器本地地址(形如blob:http://这种)。

blob一般是浏览器中的一种对象类型,file类型也是其一种。

 

如何互相进行转换?

base64到blob:

比如png格式的base64图片转成blob类型:

function pngBase64ToBlob(urlData) {
    try {
        var arr = urlData.split(',')
        var mime = arr[0].match(/:(.*?);/)[1] || 'image/png';
        // 去掉url的头,并转化为byte
        var bytes = window.atob(arr[1]);
        // 处理异常,将ascii码小于0的转换为大于0
        var ab = new ArrayBuffer(bytes.length);
        // 生成视图(直接针对内存):8位无符号整数,长度1个字节
        var ia = new Uint8Array(ab);
        
        for (var i = 0; i < bytes.length; i++) {
            ia[i] = bytes.charCodeAt(i);
        }

        return new Blob([ab], {
            type: mime
        });
    }
    catch (e) {
        var ab = new ArrayBuffer(0);
        return new Blob([ab], {
            type: 'image/png',
        });
    }
}

其他格式的图片类似,于是可以写一个通用的图片接口:

function imageBase64ToBlob(urlData, type='image/jpeg') {
    try {
        var arr = urlData.split(',')
        var mime = arr[0].match(/:(.*?);/)[1] || type;
        // 去掉url的头,并转化为byte
        var bytes = window.atob(arr[1]);
        // 处理异常,将ascii码小于0的转换为大于0
        var ab = new ArrayBuffer(bytes.length);
        // 生成视图(直接针对内存):8位无符号整数,长度1个字节
        var ia = new Uint8Array(ab);
        
        for (var i = 0; i < bytes.length; i++) {
            ia[i] = bytes.charCodeAt(i);
        }

        return new Blob([ab], {
            type: mime
        });
    }
    catch (e) {
        var ab = new ArrayBuffer(0);
        return new Blob([ab], {
            type: type,
        });
    }
}

blob转本地url:

function blobToUrl(blob_data) {
    return URL.createObjectURL(blob_data)
}

blob转base64:

function blobToBase64(blob_data, callback) {
    let reader = new FileReader()
    reader.onload = (e) => {
        if (callback) {
            callback(e.target.result)
        }
    }
    reader.readAsDataURL(blob_data)
}

url转blob:

function urlToBlob(the_url, callback) {
    let xhr = new XMLHttpRequest();
    xhr.open("get", the_url, true);
    xhr.responseType = "blob";
    xhr.onload = function() {
        if (this.status == 200) {
            if (callback) {
                callback(this.response);
            }
        }
    };
    xhr.send();
}

有了以上接口就可以三种格式互相转换了,不过url转blob和blob转base64是异步的操作,此外url还分服务器端url和浏览器本地url,需要自己使用时区分清楚。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/AndyQsmart/article/details/103067642

智能推荐

【Java】给定一个有序整数数组,找出其中两个数相加等于目标值,返回下标值_喜欢唱跳有错吗的博客-程序员秘密

import java.util.Arrays;import java.util.HashMap;public class Main { public static void main(String[] args){ int[] num={1,2,3,6,8,11}; int[] c=find(num,9); System.out...

Android上下文服务管理查询过程_服务上下文管理_快乐安卓的博客-程序员秘密

在开发Android应用程序时,如果需要使用系统提供的服务,可以通过服务名称调用山下文的getSystemService(String name)来获取服务管理者,那么该函数是如何实现服务查询的呢?frameworks\base\core\java\android\app\ContextImpl.javapublic Object getSystemService(String nam

MySQL存储引擎_大铭王朝的博客-程序员秘密

目录1、存储引擎总结对比2、存储引擎明细对比2.1、MyISAM2.2、MEMORY2.3、InnoDB(默认)3、存储引擎选择问题:MySQL有哪些存储引擎?默认是哪个?有什么区别?如何选择存引擎?1、存储引擎总结对比在mysql5之后,支持的存储引擎有9种,但是常用的就那么几种,而且默认支持的是InnoDB。我们可以使用命令来看看当前数据库可以支持的存储引擎有哪些。show engines;也可以查询当前表使用什么存储引擎: SHOW TABL.

干货!!c++new和delete工作原理 以及 针对链表节点重载operator new 和operator delete 实现链表节点使用内存池申请和释放空间_拥抱@的博客-程序员秘密

第一部分: new和delete的实现原理开始谈之前我们应该了解另一个概念“operator new”和“operator delete”:new操作符调用一个函数来完毕必需的内存分配,你可以重写或重载这个函数来改变它的行为。new操作符为分配内存所调用函数的名字是operator new()。函数operator new 通常这样声明:void * operator new(...

嵌入式系统的BootLoader技术浅析_启动过程_Wizzy1990的博客-程序员秘密

论文导读::嵌入式系统是以应用为中心、以计算机为基础、软硬件可裁剪。即启动过程可分为阶段1和阶段2两个部分。技术概述。论文关键词:嵌入式系统,启动过程,BootLoader技术  一 BootLoader技术概述  嵌入式系统是以应用为中心、以计算机为基础、软硬件可裁剪,适用于系统对功能、可靠性、成本、功耗严格要求的专用计算机系统。计算机系统都具有相应的引导程序,对于嵌入式系统在执

python编程器app_【工具】有了这个神器,轻松用 Python 写个 App_weixin_39768371的博客-程序员秘密

原标题:【工具】有了这个神器,轻松用 Python 写个 App作者:Adrien Treuille机器之心编译 编辑:可可机器学习开发者想要打造一款 App 有多难?事实上,你只需要会 Python 代码就可以了,剩下的工作都可以交给一个工具。近日,Streamlit 联合创始人 Adrien Treuille 撰文介绍其开发的机器学习工具开发框架——Streamlit,这是一款专为机器学习工程...

随便推点

静态路由的原理和配置(全程实验可跟做)_bcczqx234547的博客-程序员秘密

一、路由原理数据包从A到达B有很多路径可以选择,但是既然是多条路径,必定会有一条路径是最优的选择。因此,为了尽可能的提高网速,就需要一种方法来判断从源主机到目的主机所经过的最优路径,从而进行数据转发,这就是路由技术。1、路由器的工作原理不同网段的主机相连,这时数据的传输就需要路由器来发挥作用了。源主机发送数据包给目标主机,但两台主机又不在同一网段,所以源主机会把数据包发送给本网段的网关路由器,网...

图形验证码 java_liuyinfei_java的博客-程序员秘密

[java] view plain copy&amp;lt;span style=&quot;font-family:Arial, Helvetica, sans-serif;background-color:rgb(255,255,255);&quot;&amp;gt;&amp;lt;/span&amp;gt;  验证码效果如下:有静态的,动态的,中空的结合网上的图形验证码技术,不依赖第三方包纯java加工了一个比较复杂的图形验证码方案,防OCR...

了解java开发的8大核心竞争点,让面试官对你刮目相看_码邦主的博客-程序员秘密

最近面试java后端开发的感受:如果就以平时项目经验来面试,通过估计很难——再论面试前的准备在上周,我密集面试了若干位Java后端的候选人,工作经验在3到5年间。我的标准其实不复杂:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架,我相信其它公司招初级开发时,应该也照着这个标准来面的。我也知道,不少候选人能力其实不差,但面试时没准备或不会说,这样的人可能在进团队干活后确实能达到期望,但可能就无法通过面试,但面试官总是只根据面试情况来判断。但现实情况是,大多数人可能面试前没准备,或.

面向对象程序设计的基本概念_面向对象程序设计的基础依赖于 和 的概念_wingooom的博客-程序员秘密

概述概念面向对象 = 对象 + 类 + 继承 + 消息对象对象(Object):具有责任的实体。用来描述客观事物的实体,是构成系统的一个基本单位,由一组属性以及作用在这组属性的操作构成。特性:标识符(区别其他对象)、属性(状态)和操作(行为)。属性(Attribute):与对象关联的数据,描述对象静态特性;操作(Operation):与对象关联的程序,描述对象动态特性;类(Class):概念具有相同

线程安全(数据同步synchronized,Lock锁)_map<k, object> lockmap = collections.synchronizedm_深知她是一场梦的博客-程序员秘密

我们先看一个例子,假设去银行取钱,原始钱为20,每次只取1元,有3个人分别同时去取package com.Thread;/** * @author 林高禄 * @create 2020-05-14-15:43 */public class Test1 implements Runnable { private int a = 20; private boolean b = true; @Override public void run() { .

推荐文章

热门文章

相关标签