当前位置:   article > 正文

Base64转二进制文件流以及转File、图片转Base64、二进制流转Base64

base64转二进制

1、Base64转二进制文件流

方法一:

  1. /**
  2. * Base64字符串转二进制流
  3. * @param {String} dataurl Base64字符串(字符串包含Data URI scheme,例如:data:image/png;base64, )
  4. */
  5. function dataURLtoBlob(dataurl) {
  6. var arr = dataurl.split(","),
  7. mime = arr[0].match(/:(.*?);/)[1],
  8. bstr = atob(arr[1]),
  9. n = bstr.length,
  10. u8arr = new Uint8Array(n);
  11. while (n--) {
  12. u8arr[n] = bstr.charCodeAt(n);
  13. }
  14. return new Blob([u8arr], {
  15. type: mime,
  16. });
  17. }

调用示例:

  1. let dataurl = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAIAAAA7ljmRAAAAGElEQVQIW2P4DwcMDAxAfBvMAhEQMYgcACEHG8ELxtbPAAAAAElFTkSuQmCC';
  2. let blob = dataURLtoBlob(dataurl);

方法二:

  1. /**
  2. * Base64字符串转二进制流
  3. * @param {String} base64 Base64字符串(字符串不包含Data URI scheme)
  4. * @param {String} type 文件类型(例如:image/png)
  5. */
  6. function base64toBlob(base64, type) {
  7. // 将base64转为Unicode规则编码
  8. let bstr = atob(base64),
  9. n = bstr.length,
  10. u8arr = new Uint8Array(n);
  11. while (n--) {
  12. u8arr[n] = bstr.charCodeAt(n); // 转换编码后才可以使用charCodeAt 找到Unicode编码
  13. }
  14. return new Blob([u8arr], {
  15. type,
  16. })
  17. }

调用示例:

  1. let dataurl = 'iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAIAAAA7ljmRAAAAGElEQVQIW2P4DwcMDAxAfBvMAhEQMYgcACEHG8ELxtbPAAAAAElFTkSuQmCC';
  2. let blob = base64toBlob(dataurl, 'image/png');

 2、Base64转File

方法一:

  1. /**
  2. * Base64字符串转File文件
  3. * @param {String} dataurl Base64字符串(字符串包含Data URI scheme,例如:data:image/png;base64, )
  4. * @param {String} filename 文件名称
  5. */
  6. function dataURLtoFile(dataurl, filename) {
  7. let arr = dataurl.split(',');
  8. let mime = arr[0].match(/:(.*?);/)[1];
  9. let bstr = atob(arr[1]);
  10. let n = bstr.length;
  11. let u8arr = new Uint8Array(n);
  12. while (n--) {
  13. u8arr[n] = bstr.charCodeAt(n);
  14. }
  15. return new File([u8arr], filename, {
  16. type: mime
  17. });
  18. }

调用示例:

  1. let dataurl = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAIAAAA7ljmRAAAAGElEQVQIW2P4DwcMDAxAfBvMAhEQMYgcACEHG8ELxtbPAAAAAElFTkSuQmCC';
  2. let file = dataURLtoFile(dataurl, '文件名称');

方法二:

  1. /**
  2. * Base64字符串转File文件
  3. * @param {String} base64 Base64字符串(字符串不包含Data URI scheme)
  4. * @param {String} filename 文件名称
  5. * @param {String} type 文件类型(例如:image/png)
  6. */
  7. function base64toFile(base64, filename, type) {
  8. // 将base64转为Unicode规则编码
  9. let bstr = atob(base64);
  10. let n = bstr.length;
  11. let u8arr = new Uint8Array(n);
  12. while (n--) {
  13. u8arr[n] = bstr.charCodeAt(n); // 转换编码后才可以使用charCodeAt 找到Unicode编码
  14. }
  15. return new File([u8arr], filename, {
  16. type: type
  17. });
  18. }

调用示例:

  1. let dataurl = 'iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAIAAAA7ljmRAAAAGElEQVQIW2P4DwcMDAxAfBvMAhEQMYgcACEHG8ELxtbPAAAAAElFTkSuQmCC';
  2. let file = base64toFile(dataurl, '文件名称', 'image/png');

补充:

3、图片转Base64

  1. /**
  2. * 图片转换为base64
  3. * @param {Object} img 图片对象
  4. */
  5. function getBase64Image(img) {
  6. var canvas = document.createElement("canvas");
  7. canvas.width = img.width;
  8. canvas.height = img.height;
  9. var ctx = canvas.getContext("2d");
  10. ctx.drawImage(img, 0, 0, img.width, img.height);
  11. var ext = img.src.substring(img.src.lastIndexOf(".") + 1).toLowerCase();
  12. var dataURL = canvas.toDataURL("image/" + ext);
  13. return dataURL;
  14. }

调用示例:

  1. let img = new Image();
  2. img.setAttribute('crossOrigin', 'anonymous');
  3. // 图片地址
  4. img.src = 'https://img2.baidu.com/it/u=1987571340,2982374133&fm=253&fmt=auto&app=138&f=JPEG?w=499&h=500';
  5. img.onload = () => {
  6. // 获得Base64
  7. let base64Str = getBase64Image(img);
  8. console.log(base64Str)
  9. }

4、二进制流转Base64

方法一:

  1. /**
  2. * 二进制流转Base64(字符串包含Data URI scheme)
  3. * @param {Object} data 二进制流
  4. * @param {String} type 文件类型(例如:image/png)
  5. */
  6. function getDataURL(data, type) {
  7. return new Promise((resolve, reject) => {
  8. const blob = new Blob([data], {
  9. type
  10. });
  11. const reader = new FileReader();
  12. reader.readAsDataURL(blob);
  13. reader.onload = () => resolve(reader.result);
  14. reader.onerror = (error) => reject(error);
  15. });
  16. }

调用示例:

  1. /**
  2. * Base64转二进制流
  3. * @param {String} dataurl Base64字符串(字符串包含Data URI scheme,例如:data:image/png;base64, )
  4. */
  5. function getBlob(dataurl) {
  6. var arr = dataurl.split(","),
  7. mime = arr[0].match(/:(.*?);/)[1],
  8. bstr = atob(arr[1]),
  9. n = bstr.length,
  10. u8arr = new Uint8Array(n);
  11. while (n--) {
  12. u8arr[n] = bstr.charCodeAt(n);
  13. }
  14. return {
  15. data: u8arr,
  16. type: mime
  17. };
  18. }
  1. // 获得二进制流(就不调接口了,先用Base64转成二进制流进行测试)
  2. let dataurl =
  3. 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAIAAAA7ljmRAAAAGElEQVQIW2P4DwcMDAxAfBvMAhEQMYgcACEHG8ELxtbPAAAAAElFTkSuQmCC';
  4. let blob = getBlob(dataurl);
  5. // 二进制流转Base64
  6. getDataURL(blob.data, blob.type).then((base64) => {
  7. console.log(base64);
  8. });

方法二:

  1. /**
  2. * 二进制流转Base64(字符串不包含Data URI scheme)
  3. * @param {Object} data 二进制流
  4. */
  5. function getBase64(data) {
  6. let base64 = btoa(new Uint8Array(data).reduce((data, byte) => data + String.fromCharCode(byte), ''));
  7. return base64;
  8. }

调用示例:

  1. // 获得二进制流(就不调接口了,先用Base64转成二进制流进行测试)
  2. let dataurl =
  3. 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAIAAAA7ljmRAAAAGElEQVQIW2P4DwcMDAxAfBvMAhEQMYgcACEHG8ELxtbPAAAAAElFTkSuQmCC';
  4. let blob = getBlob(dataurl);
  5. // 二进制流转Base64
  6. let base64 = getBase64(blob.data);
  7. console.log(base64);

5、补充

5.1 atob()

atob() 对经过 base-64 编码的字符串进行解码。你可以使用 window.btoa() 方法来编码一个可能在传输过程中出现问题的数据,并且在接受数据之后,使用 atob() 方法再将数据解码。例如:你可以编码、传输和解码操作各种字符,比如 0-31 的 ASCII 码值。 

使用:

let encodedData = window.btoa("Hello, world"); // 编码

5.2 btoa()

btoa() 方法可以将一个二进制字符串(例如,将字符串中的每一个字节都视为一个二进制数据字节)编码为 Base64 编码的 ASCII 字符串。

你可以使用这个方法来对可能遇到通信问题的数据进行编码,然后使用 atob() 方法来对数据进行解码。例如,你可以对 ASCII 中的控制字符(值为 0 到 31 的字符)进行编码。

使用:

  1. const encodedData = btoa('Hello, world'); // 编码字符串
  2. const decodedData = atob(encodedData); // 解码字符串

5.3 charCodeAt()

charCodeAt() 方法可返回指定位置的字符的 Unicode 编码,返回值是 0 - 65535 之间的整数,表示给定索引处的 UTF-16 代码单元。

字符串中第一个字符的位置为 0, 第二个字符位置为 1,以此类推。

使用:

  1. var str = "Hello, world";
  2. var code = str.charCodeAt(0);

5.4 fromCharCode()

fromCharCode() 可接受一个指定的 Unicode 值,然后返回一个字符串。

注意:该方法是 String 的静态方法,字符串中的每个字符都由单独的 Unicode 数字编码指定。使用语法: String.fromCharCode()。

使用:

  1. var str = "Hello, world";
  2. var code = str.charCodeAt(0);
  3. var result = String.fromCharCode(code);

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/125296
推荐阅读
相关标签
  

闽ICP备14008679号