首页 > 其他分享 >JS二进制文件转换:File、Blob、Base64、ArrayBuffer

JS二进制文件转换:File、Blob、Base64、ArrayBuffer

时间:2023-04-02 15:46:59浏览次数:38  
标签:canvas img URL ArrayBuffer Base64 JS Blob File

文件类型

JS 提供了一些 API 来处理文件或原始文件数据,例如:File、Blob、FileReader、Base64、ArrayBuffer、Canvas 等。

图源:知乎-前端充电宝

类型说明

Blob

Blob 对象表示一个不可变、原始数据的类文件对象。Blob 表示的不一定是 JavaScript 原生格式的数据。File 接口基于 Blob,继承了 blob 的功能并将其扩展以支持用户系统上的文件。

Blob 对象是包含有只读原始数据的类文件对象。简单来说,Blob 对象就是一个不可修改的二进制文件。

File

文件(File)接口提供有关文件的信息,并允许网页中的 JavaScript 访问其内容。

File 对象是特殊类型的 Blob,且可以用在任意的 Blob 类型的 context 中。比如说, FileReader, URL.createObjectURL(), createImageBitmap()(en-US), 及 XMLHttpRequest.send() 都能处理 Blob 和 File。

以下为 FileReader 的对象方法:

方法 说明
FileReader.abort() 中止读取操作。在返回时,readyState属性为DONE
FileReader.readAsArrayBuffer() 开始读取指定的 Blob中的内容。完成后,result 属性中保存的将是被读取文件的 ArrayBuffer 数据对象。
FileReader.readAsBinaryString() 开始读取指定的Blob中的内容。完成后,result属性中将包含所读取文件的原始二进制数据
FileReader.readAsDataURL() 开始读取指定的Blob中的内容。完成后,result属性中将包含一个data: URL 格式的 Base64 字符串以表示所读取文件的内容
FileReader.readAsText() 开始读取指定的Blob中的内容。一旦完成,result属性中将包含一个字符串以表示所读取的文件内容

Base64

Base64 是一组相似的二进制到文本(binary-to-text)的编码规则。一个常见应用是对二进制数据进行编码,以便将其纳入 dataURL 中。

在 JavaScript 中,有两个函数被分别用来处理解码和编码 Base64 字符串:

  • atob():解码通过 Base-64 编码的字符串数据(“atob”应读作“ASCII to binary”)
  • btoa():从二进制数据“字符串”创建一个 Base-64 编码的 ASCII 字符串(“btoa”应读作“binary to ASCII”)
<!-- 读取文件,用 Bse64 展示图片 -->
<!DOCTYPE html>
<html lang="en">
  <body>
    <input type="file" id="input" />
    <img id="img" />

    <script>
      const input = document.getElementById("input");
      const img = document.getElementById("img");

      input.onchange = (e) => {
        const reader = new FileReader();
        reader.readAsDataURL(e.target.files[0]);
        reader.onload = (e) => {
          img.src = e.target.result;
          console.log(e.target.result);
        };
      };
    </script>
  </body>
</html>

Object URL

Object URL(MDN 定义名称)又称 Blob URL(W3C 定义名称),是 HTML5 中的新标准。它是一个用来表示 File Object 或 Blob Object 的 URL。

Blob URL/Object URL 是一种伪协议,允许将 Blob 和 File 对象用作图像、二进制数据下载链接等的 URL 源。

<!-- 通过 Object URL 展示和下载图片 -->
<!DOCTYPE html>
<html lang="en">
  <body>
    <input type="file" id="input" />
    <img id="img" />

    <script>
      const input = document.getElementById("input");
      const img = document.getElementById("img");

      input.onchange = (e) => {
        const url = URL.createObjectURL(e.target.files[0]);
        img.src = url;

        // 实现下载
        const a = document.createElement("a");
        a.href = url;
        a.download = "img";
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
      };
    </script>
  </body>
</html>

ArrayBuffer

ArrayBuffer 对象用来表示通用的、固定长度的原始二进制数据缓冲区。(只读)

类型转换

1. Blob、File → Base64

function fileToDataURL(file) {
  let reader = new FileReader();
  reader.readAsDataURL(file);
  reader.onload = function (e) {
    return reader.result;
  };
}

2. Base64 → Blob、File

// Base64 转为 Blob
function dataURLToBlob(fileDataURL) {
  let arr = fileDataURL.split(","),
    mime = arr[0].match(/:(.*?);/)[1],
    bstr = atob(arr[1]),
    n = bstr.length,
    u8arr = new Uint8Array(n);
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }
  return new Blob([u8arr], { type: mime });
}

// Base64 转为 File
function dataURLToBlob(fileDataURL, filename) {
  let arr = fileDataURL.split(","),
    mime = arr[0].match(/:(.*?);/)[1],
    bstr = atob(arr[1]),
    n = bstr.length,
    u8arr = new Uint8Array(n);
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }
  return new File([u8arr], filename, { type: mime });
}

3. Blob、File → Object URL

// object:用于创建 URL 的 File 对象、Blob 对象
const objectUrl = URL.createObjectURL(object)

4. ArrayBuffer → Blob

const blob = new Blob([new Uint8Array(buffer, byteOffset, length)])

5. ArrayBuffer → base64

const base64 = btoa(String.fromCharCode.apply(null, new Uint8Array(arrayBuffer)))

6. Blob → ArrayBuffer

function blobToArrayBuffer (blob) { 
  const reader = new FileReader()
  reader.readAsArrayBuffer(blob)
  reader.onload = () =>{
    return reader.result;
  }
}

7. Blob、File 文件数据绘制到 canvas

// 思路:Blob、File ——> dataURL(Base64) ——> canvas
function fileAndBlobToCanvas(fileDataURL) {
  let img = new Image()
  img.src = fileDataURL
  let canvas = document.createElement('canvas')
  if (!canvas.getContext) {
    alert('浏览器不支持canvas')
    return
  }
  let ctx = canvas.getContext('2d')
  document.getElementById('container').appendChild(canvas)
  img.onload = function () {
    ctx.drawImage(img, 0, 0, img.width, img.height)
  }
}

8. 从 canvas 中获取文件 Base64

function canvasToDataURL() {
  let canvas = document.createElement('canvas')
  let canvasDataURL = canvas.toDataURL('image/png', 1.0)
  return canvasDataURL
}

标签:canvas,img,URL,ArrayBuffer,Base64,JS,Blob,File
From: https://www.cnblogs.com/Faith-Yin/p/17280585.html

相关文章

  • reverse/base64变体类型
    例:【BUU】特殊的BASE64进入main函数后发现rightflag明显是base64加密的结果(补=)随后发现右base64encode函数进入后发现是传统的base64加密方式,猜测是密码表的变体利用shitf+f12查看字符串发现有类似密码表的字符串利用脚本进行解密importbase64outab="ABCDEFGHIJKLMNOP......
  • JS封装思想
      js:   ......
  • 车牌录入控件JS+CSS+JQuery
      HTML<divclass="carcodeBox"><divclass="carLicenseMain"><ul><li></li><li></li><li></li><li></li><li></li><li></li><li></l......
  • JS的继承
         ......
  • 关于ether.js的版本
    今天遇到一个很搞心态的问题,是在按照网上的etherjs教程,在hardhat环境下,利用ether.js的jsonrpcprovider建立节点与以太坊之间的网络连接时遇到的,以下是代码:constethers=require("ethers");//constJsonRpcProvider=ethers.providers;asyncfunctionmain(){constINFUR......
  • RSA加密与解密(jsencrypt.js)
    写在开头RSA加密不过多解释,直接描述使用时的流程和方法RSA加密一般是公钥加密私钥解密,多用于前台公钥加密传参给后台,后台私钥解密。本次我用到的场景是跨系统地址栏传参,参数需要加密处理。使用RSA加密时需要用到jsencrypt,使用方法会介绍怎么安装及使用jsencrypt介绍jsencrypt......
  • JS基础《JavaScript精粹》笔记摘录
    基础概念和语法基本类型、null、undefined、NaNJavaScript定义了一小批基本类型(primitivetype),它们包括字符串类型(string,单引号或双引号包起来)、数值类型(number,整数和小数都用这个类型)和布尔类型(boolean,值仅有true和false)。JavaScript使用两个特殊的值来表示不存在有意义的值—......
  • JS基础-jQuery快速入门
    作用简介:jQuery是一个JavaScript库,它极大地简化了JavaScript编程,极大简化了DOM操作及事件处理。它通过CSS选择器定位元素,并将这些元素封装在特定JavaScript对象中,然后,开发者就可以更改元素或者给元素添加事件监听器。jQuery能够处理的任何工作,都可以用既有的JavaScript代码......
  • Hello QuickJS
    #include"quickjs.h"#include"quickjs-libc.h"#include<string.h>JSRuntime*QJSRuntime=nullptr;JSContext*QJSContext=nullptr;JSContext*CreateQJSContext(JSRuntime*InRuntime){JSContext*RetVal=JS_NewContext(QJSR......
  • [JSP] 笔记
    JSPjavaserverpagesjava服务端页面jsp=java+html为什么用JSP?JSP为动态页面而生,当页面需要展示动态的数据时,我们不可能像下图这样用servlet中的write写整个页面。那样太过繁琐和复杂。JSP的作用:简化开发,避免用Servlet输出HTML标签。JSP原理JSP本质上......