前端将base64图片转换成file文件

news2024/12/23 10:59:00

1、base64转成file具体代码

  // base64图片转file的方法(base64图片, 设置生成file的文件名)
  function base64ToFile(base64, fileName) {
      // 将base64按照 , 进行分割 将前缀  与后续内容分隔开
      let data = base64.split(',');
      // 利用正则表达式 从前缀中获取图片的类型信息(image/png、image/jpeg、image/webp等)
      let type = data[0].match(/:(.*?);/)[1];
      // 从图片的类型信息中 获取具体的文件格式后缀(png、jpeg、webp)
      let suffix = type.split('/')[1];
      // 使用atob()对base64数据进行解码  结果是一个文件数据流 以字符串的格式输出
      const bstr = window.atob(data[1]);
      // 获取解码结果字符串的长度
      let n = bstr.length
      // 根据解码结果字符串的长度创建一个等长的整形数字数组
      // 但在创建时 所有元素初始值都为 0
      const u8arr = new Uint8Array(n)
      // 将整形数组的每个元素填充为解码结果字符串对应位置字符的UTF-16 编码单元
      while (n--) {
        // charCodeAt():获取给定索引处字符对应的 UTF-16 代码单元
        u8arr[n] = bstr.charCodeAt(n)
      }
      // 利用构造函数创建File文件对象
      // new File(bits, name, options)
      const file =  new File([u8arr], `${fileName}.${suffix}`, {
        type: type
      })
      // 将File文件对象返回给方法的调用者
      return file;
  }

// 调用方法 此时的base64是初始file转换的
const file = base64ToFile(base64,'base64转file生成的文件')
console.log('base64转回file的---',file);
// 将转换后获得的file文件显示在页面的img元素上
document.querySelector('#img').src = window.webkitURL.createObjectURL(file)
文件转换过程:

在这里插入图片描述

2、代码解析

​ 该方法涉及知识点较多,首先因为base64的前缀信息部分与文件内容部分是通过,进行连接的,data:image/***;base64(前缀信息),xxxxx(文件内容),所以利用split()方法对base64进行分割,将前缀文件信息,与文件内容分隔开。得到文件前缀信息后,我们就可以利用string.match()方法结合正则表达式,从前缀中获取到文件的类型信息(image/png、image/jpeg、image/webp)以及具体的格式后缀(pngjpegwebp),保存这些信息,在创建file文件时使用。

​ 接下来我们要对文件内容部分进行处理,借助window.atob()方法对base64文件数据进行解码,获取原来的文件数据流信息,但是以字符串的格式输出。然后利用new Uint8Array(length)创建一个与文件数据流字符串长度相同的8位无符号的整型数字数组,通过该方法创建的整形数组,所有元素初始值都为0。再通过while循环将刚才创建的整形数组中的元素,按照索引替换成文件数据流字串符中对应位置上字符的 UTF-16 代码单元,string.charCodeAt(index)可以获取字符串对应index位置字符的 UTF-16 代码单元,值是位于0~65535之间的整数数字。

​ 最后我们通过File(bits, name, options)构造函数,传入对应的参数创建一个新的file对象后,返回给方法的调用者。至此,完成了base64到file文件的转换。

3、base64

​ 一个完整的base64图片,包含两部分信息的,一部分是文件前缀信息,一部分是表示文件内容信息,例如:data:image/***(表示文件的类型);base64(表示格式),xxxxx(表示文件内容)。我们在base64转换为file的过程中,只需要对文件内容信息进行转换即可,但转换后的file文件类型属性,需要通过文件前缀信息来决定。

红线标注部分为文件前缀信息,其余部分为文件内容:

在这里插入图片描述

4、window.atob()window.btoa()

window.btoa()方法可以将一个二进制字符串进行编码为base64编码的ASCII 字符串。我们可以使用这个方法对可能遇到通信问题的字符串进行编码处理,但是有一点要注意:该方法不能对中文字符进行编码处理,只能对英文字母、英文符号和数字进行编码处理。

在这里插入图片描述

window.atob()方法可以对经过base64编码的字符串进行解码处理,可以将window.btoa()编码后的数据,进行还原;也可以将bsae64格式的文件,解码成原本的文件数据流信息。

在这里插入图片描述

注: window.atob()window.btoa()兼容IE9以上浏览器。

如果想要实现对中文字符的编码和解码处理,则需要结合encodeURIComponent()decodeURIComponent()方法:

编码的过程: 中文字符 —> 先encodeURI —> 再btoa编码
解码的过程: 先atob解码 —> 再decodeURI —> 中文字符

5、File()

File(bits, name[, options])方法是File对象的构造函数,拥有两个必填参数和一个可选参数:

​ 第一个参数bits(必填),表示文件的内容,可以是包含ArrayBufferArrayBufferViewBlob,或者 DOMString 对象的 Array ,以及任何这些对象的组合;

​ 第二个参数name(必填),表示创建的file对象的name属性,也就是文件的名字。

​ 第三个参数是options(可选),是一个对象格式的参数,表示文件的可选属性,可选属性有两条:① type:字符串数据,表示文件的类型(image/png、image/jpeg、image/webp等),默认值为""。 ② lastModified:数值型数据,表示文件最后修改时间的Unix时间戳,默认值为Data.now()

6、相关文档

前端FileReader对象实现图片file文件转base64

Base64

atob()

Uint8Array

match()

chartCodeAt()

File()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/360896.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PAT 甲级 1002 python 测试点1未通过

题目: 思路: 1注意多项式非零项的数目 2两项相加为0时不输出 3 测试点1未通过 代码: C{} Alist(input().split()) Blist(input().split())count0 for i in range(int(A[0])):C[A[i*21]]float(A[i*22])count count 1for i in range(int(B…

支付宝支付功能使用

1、进入“蚂蚁金服开放平台” https://open.alipay.com/https://open.alipay.com/ 2、下载支付宝官方 demo,进行配置和测试 文档地址 手机网站支付 DEMO | 网页&移动应用支付宝文档中心https://opendocs.alipay.com/open/02no47 demo下载 网页…

如何使用ngxin的 upstream

1.引言: 1.1反向代理: 反向代理是充当Web服务器网关的代理服务器。当您将请求发送到使用反向代理的Web服务器时,他们将先转到反向代理,由该代理将确定是将其路由到Web服务器还是将其阻止。 这意味着有了反向代理,您…

Java Stream流1

目录1 Stream流1.1 Stream流的生成方式1.2 Stream流中间操作之 filter1.3 Stream流中间操作之 limit 和 skip1.4 Stream流中间操作之 concat 和 distinct1 Stream流 体验Stream流需求 package test;import java.lang.reflect.Array; import java.util.ArrayList;public clas…

Arduino IDE搭建Heltec开发板开发环境

Arduino IDE搭建Heltec开发板开发环境Heltec开发板开发环境下载与搭建Arduino IDE下载与安装搭建Heltec开发板的开发环境添加package URL方法通过Git的方法安装离线安装Heltec开发板开发环境下载与搭建 Arduino IDE下载与安装 Heltec的ESP系列和大部分的LoRa系列开发板都是用A…

2.Gin内容介绍

目录 参考 主要内容 关于Web 创建项目 为什么要用框架 Gin框架介绍 Gin框架安装与使用 安装 第一个Gin示例: RESTful API Gin渲染 HTML渲染 自定义模板函数 静态文件处理 使用模板继承 补充文件路径处理 JSON渲染 XML渲染 YMAL渲染 protobuf渲染…

【Java基础 下】 024 -- 集合进阶(双列集合、HashMap、LinkedHashMap、TreeMap、Collections)

学习内容: 目录 一、双列集合 1、双列集合的特点 2、双列集合的常见API 示例代码 3、Map的遍历方式 ①、第一种遍历方式:键找值(keySet) ②、第二种遍历方式:键值对(entrySet) ③、第三种遍历方…

LeetCode 周赛 333,你管这叫 Medium 难度?

本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问。 大家好,我是小彭。 上周是 LeetCode 第 333 场周赛,你参加了吗?这场周赛质量很高,但难度标得不对,我真的会谢。算法…

深度学习在视频多目标跟踪中的应用综述

文章目录摘要1、简介2、MOT:算法、指标和数据集2.1、MOT算法简介2.2、指标经典的指标完整的MOT指标ID 分数2.3、基准数据集3、MOT中的深度学习3.1、深度学习中的检测步骤3.1.1、Faster R-CNN3.1.2、SSD3.1.3、Other detectors3.1.4、cnn在检测步骤中的其他用途3.2、深度学习在特…

Git的常用命令

1:软件安装1.1:Git下载与安装百度上搜索Git官网:https://git-scm.com/下载:https://git-scm.com/download/win下载Git安装程序,双击安装 Git-2.9.3.2-64-bit.exe配置环境变量path 使用git --version查看 git 是否安装成…

儿童袖套上架美国亚马逊CPC认证

袖套,也称套袖。是戴在袖管外的套子,旨在保护衣服的袖管。通常戴时松垂于另外一只衣袖外面的袖子。美国CPC认证简介:CPC认证是Children’s Product Certificate的英文简称,CPC证书就类似于国内的质检报告,在通过相关检…

(十七)docker安装RocketMQ

一、简介 操作系统:Linux CentOS 7.3 64位 docker版本:19.03.8 RocketMQ版本:4.3.2 二、实践 1、拉取镜像 docker pull rocketmqinc/rocketmq:4.3.2 2、运行容器 我们先搭建namesrv(Name Server)服务。 它充当路由消息的提供者&#…

vue2提取vue-router的title单独存放,使用i18n实现

成品效果 首先引入i18n(vue-i18n官网文档) 依赖包 npm install vue-i18n8然后单独在src目录下新建一个文件夹lang,存放相对应的变量名称,我这里只做显示中文所以其他引入我都注释了,具体目录如下: src\lang/zh.js部分代码 export…

记一次:request请求总结

前言:和前端联调的时候发现前端人员请求的方式不对,固做此总结问题:request请求方式有多少种?答:Java后端查看有8种,spring-web中的java枚举图如下而使用PostMan查看有15种,如下图GET&#xff0…

前端页面jquery规范写法

使用最新版本的 jQuery 最新版本的 jQuery 会改进性能和增加新功能,若不是为了兼容旧浏览器,建议使用最新版本的 jQuery。以下是三条常见的 jQuery 语句,版本越新,性能越好: $(.elem) $(.elem, context) context.find(.elem) 结果 1.6.2 版执行次数远超两个老版本。 jQ…

eclipse中整理左侧项目栏文件

💡在使用eclipse的过程中,随着项目越来越多,会使得项目管理变得困难,介绍一下eclipse中对于项目分类存放(Java Working Set)的解决方案。如果按照默认的方式查看项目列表是这种效果:⭕当创建使用小项目过多…

Prometheus+Grafana监控

1、简介1.1 Prometheus官网地址:https://prometheus.io/Prometheus是一个开源的监控系统,起源于SoundCloud。它由以下几个核心组件构成:数据爬虫: 根据配置的时间定期的通过HTTP抓去metrics数据。time-series 数据库: …

Ubantu 安装到VMware详解

想要在VMware中运行Linux系统,那么就需要Linux系统安装到VMware虚拟机上面。在这里,以把ubantu16.04安装到VMware虚拟机中为教程进行图文讲解,共分为三个步骤,分别是创建新的虚拟机、安装到ubantu系统、安装VMware Tools。 1.1 创…

响应式网络建站公司网站源码+完整教程

分享一个开源的自适应的三网合一的网络建站公司网站的完整源码,当做互联网公司官网特别合适,带完整搭建教程。此款网站源码适用于小程序制作公司、网络公司、网站建设公司等等,这些都可以用这个网站模板,网站整体非常高端大气&…

vue+vite项目部署会遇到的几个问题

今天来打包硅谷外卖项目,通过解决项目中遇到的问题来加深对vite打包的理解。 运行yarn build 报错,报[WARNING] Expected identifier but found “*” [css-syntax-error] 既然zoom:1是没有变化,直接把它去掉即可。 然后继续yarn build 不出所料还是报…