前端对文件转换处理的一些常用方法

文章目录

    • 0,前言
    • 1,将图片的url网络链接(http://) 转为base64格式
    • 2,将base64的图片数据转换为file文件
    • 3,将以base64的图片数据转换为Blob
    • 4,将file文件转化为base64
    • 5,将file文件转换为Blob
    • 6,获取文件(图片视频等)的本地内存地址 可以直接访问
    • 7,视频截帧(截取视频的第一帧)
    • 8,总结

本篇文章侧重点是对图片文件的处理,比如url转file、转base64;file转blob类型等。

注意:不要把视频文件转成base64,因为base64格式本质是一串很长的字符串,如果在手机端上传大一点的视频文件并有转bsee64的操作,那么就会导致页面自动刷新、程序崩溃、甚至浏览器直接被系统杀掉,因为视频的base64字符串太大会撑报内存的。

如果上传视频文件后,想要对视频的回显可以使用createObjectUrl()方法来生成临时的内存地址来访问。


0,前言

JavaScript 提供了一些 API 来处理文件或原始文件数据,例如:File、Blob、FileReader、ArrayBuffer、base64 等; 了解它们会对下面的一些方法更容易理解;

推荐阅读以下博客

(知乎):1,https://zhuanlan.zhihu.com/p/568915443
(csdn):2,https://blog.csdn.net/mrlaochen/article/details/120209650

在这里插入图片描述



1,将图片的url网络链接(http://) 转为base64格式

/*** 将图片的url网络链接(http://) 转为base64格式* @param {string}*/export function imgUrlToBase64(imgUrl) {return new Promise((resolve) => {var img = new Image();img.src = imgUrl;// 设置图片跨域属性img.setAttribute("crossOrigin", "anonymous");// 注意 onload是异步的行为img.onload = () => {var canvas = document.createElement("canvas");canvas.width = img.width;canvas.height = img.height;var ctx = canvas.getContext("2d");ctx.drawImage(img, 0, 0);var dataURL = canvas.toDataURL("image/png");resolve(dataURL);};});
}

使用如下:

      // 网络图片链接let finalImg = "https://img0.baidu.com/it/u=3021883569,1259262591&fm=253&fmt=auto&app=120&f=JPEG?w=1140&h=641";// 开始使用imgUrlToBase64(finalImg).then((res) => {console.log("res:", res);});

2,将base64的图片数据转换为file文件

/*** 将以base64的图片数据转换为File文件* @param {string}*/
export function base64ToFile(dataUrl, fileName = "myFile") {let arr = dataUrl.split(",");let mime = arr[0].match(/:(.*?);/)[1];let suffix = mime.split("/")[1];let bstr = atob(arr[1]);let n = bstr.length;let u8arr = new Uint8Array(n);while (n--) {u8arr[n] = bstr.charCodeAt(n);}return new File([u8arr], `${fileName}.${suffix}`, {type: mime});
}

使用案例

      <input type="file" />// 原生添加点击事件document.getElementsByTagName("input")[0].onchange = async function (e) {// 拿到的文件类型let file = e.target.files[0];console.log("file:",file);// 先转为base64let base64 = await fileTransferBase64(file);// 将以base64的图片url数据转换为File文件let file2 = base64ToFile(base64)  ================注意看这行===================console.log("file2:", file2);};

3,将以base64的图片数据转换为Blob

/*** 将以base64的图片数据转换为Blob * @param urlData 用url方式表示的base64图片数据*/function base64UrlToBlob(urlData, filename) {try {if (urlData == "" || !urlData) {return console.warn("urlData不存在");}if (!filename) {filename = "myfile";}// 以base64的图片url数据转换为Blobvar arr = urlData.split(","),mime = arr[0].match(/:(.*?);/)[1],bstr = atob(arr[1]),n = bstr.length,u8arr = new Uint8Array(n);while (n--) {u8arr[n] = bstr.charCodeAt(n);}let bold = new Blob([u8arr], { type: mime });return { bold, filename };} catch (error) {console.warn("base64转换为Blob出问题了:", error);}}

使用案例

 	  <input type="file" />// 原生添加点击事件document.getElementsByTagName("input")[0].onchange = async function (e) {// 拿到的文件类型let file = e.target.files[0];console.log("file:", file);let base64 = await fileTransferBase64(file);// 将以base64的图片url数据转换为File文件let blob = base64UrlToBlob(base64);  =======注意这行=========console.log("blob:", blob);};

4,将file文件转化为base64

  /*** 将file文件转化为base64 使用promise* @param file 该文件的file类型*/export function fileTransferBase64(file) {try {return new Promise((resolve, reject) => {const reader = new FileReader(); //异步读取reader.readAsDataURL(file);// 成功和失败返回对应的信息,reader.result一个base64,可以直接使用reader.onload = (e) => {resolve(e.target.result);};// 失败返回失败的信息reader.onerror = (error) => {console.warn('file文件转化为base64s失败:', error);reject(error);};});} catch (error) {console.warn('捕获fileTransferBase64方法的错误:', error);}}

使用案例

转file类型 涉及到异步 所以要用 promise 来封装一下;

      <input type="file" />// 原生添加点击事件document.getElementsByTagName("input")[0].onchange = async function (e) {// 拿到的文件类型let file = e.target.files[0];// 转file类型 涉及到异步 所以要用 promiselet base64 = await fileTransferBase64(file)console.log("base64:",base64);};

5,将file文件转换为Blob

  /*** 直接将file数据转换为Blob * @param file格式*/export function fileToBlob(file) {return new Promise((resolve, reject) => {// FileReader  异步读取文件const reader = new FileReader();// readAsDataURL: dataurl它的本质就是图片的二进制数据, 进行base64加密后形成的一个字符串,reader.readAsDataURL(file);// 成功和失败返回对应的信息,reader.result一个base64,可以直接使用reader.onload = (e) => {let arr = e.target.result.split(',');let mime = arr[0].match(/:(.*?);/)[1];console.log(mime);const blob = new Blob([e.target.result], { type: mime });resolve(blob);};// 失败返回失败的信息reader.onerror = (error) => {console.warn('file数据转换为Blob失败:', error);reject(error);};});}

使用案例

转blob类型也涉及到异步 所以要用 promise 来封装一下;

      <input type="file" />// 原生添加点击事件document.getElementsByTagName("input")[0].onchange = async function (e) {// 拿到的文件类型let file = e.target.files[0];// 转file类型 涉及到异步 所以要用 promiselet blob = await fileToBlob(file);console.log("blob:", blob);};

6,获取文件(图片视频等)的本地内存地址 可以直接访问

此方法可以用来上传文件之后的回显。

  /*** 获取文件(图片视频等)的本地内存地址 可以直接访问* @param file  该文件的文件流*/export function createObjectURLFun(file) {let url = '';if (window.createObjectURL != undefined) {// basicurl = window.createObjectURL(file);} else if (window.URL != undefined) {// mozilla(firefox)url = window.URL.createObjectURL(file);} else if (window.webkitURL != undefined) {// webkit or chromeurl = window.webkitURL.createObjectURL(file);}return url;}

使用案例

      // 原生添加点击事件document.getElementsByTagName("input")[0].onchange = async function (e) {// 拿到的文件类型let file = e.target.files[0];let objectURL = createObjectURLFun(file)console.log("objectURL:", objectURL); //打印结果:  objectURL: blob:null/31fff142-4b83-4749-b71d-a9a4f6c16a43};

7,视频截帧(截取视频的第一帧)

常用上传视频文件后截取视频文件的第一帧当做封面使用;

第一种:

/*** 获取视频的第一帧 来当做封面  * @param url 视频的url 可以是一个由window.URL.createObjectURL返回的视频内存临时地址(推荐使用)*/
export function getFirstImg(url) {return new Promise(function (resolve, reject) {try {let dataURL = '';let width = '90'; // 单位是px 可以随意更改let height = '90';let listen = 'canplay';//需要监听的事件let video = document.createElement('video');let canvas = document.createElement('canvas');//使用严格模式('use strict');video.setAttribute('crossOrigin', 'anonymous'); //处理跨域video.setAttribute('src', url);video.setAttribute('width', width);video.setAttribute('height', height);video.currentTime = 1; // 第一帧video.preload = 'auto'; //metadata:抓取原数据//判断IOS 监听 durationchange或progress  但是在ios会出现黑屏if (/iPad|iPhone|iPod/.test(navigator.userAgent)) {video.load();video.autoplay = true;video.muted = true; //静音listen = 'loadeddata';}// 第二版 dataLoadvideo.addEventListener(listen, () => {console.log("我走了");canvas.width = width;canvas.height = height;canvas.getContext('2d').drawImage(video, 0, 0, width, height); //绘制canvasdataURL = canvas.toDataURL('image/jpeg'); //转换为base64resolve(dataURL);});} catch (error) {console.log('视频截帧的失败报错:', error);}});
}

第二种:

export function getFirstImg2(url) {const video = document.createElement("video");video.crossOrigin = "anonymous"; // 允许url跨域video.autoplay = true; // 自动播放video.muted = true; // 静音video.src = url;return new Promise((resolve, reject) => {try {video.addEventListener("loadedmetadata",() => {console.log("loadedmetadata");video.currentTime = 2;const canvas = document.createElement("canvas");video.addEventListener("canplaythrough", () => {console.log("canplaythrough");canvas.width = video.videoWidth;canvas.height = video.videoHeight;canvas.getContext("2d").drawImage(video, 0, 0, canvas.width, canvas.height);const firstFrame = canvas.toDataURL();// console.log(firstFrame); // 输出第一帧画面的Base64编码字符串resolve(firstFrame);});},{ once: true });} catch (err) {console.error(err);reject("");}});
}

8,总结

以上的几个方法如果使用了new Promise 说明里面存在异步操作,那么在调用的时候要使用 .then来获取转换后的文件。或直接使用 async await 语法进行接收resolve ()方法返回的文件;

保证代码能够同步运行,避免预料之外的问题;

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

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

相关文章

利用Opencv实现人像迁移

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天来学习一下如何使用Opencv实现人像迁移&#xff0c;欢迎大家一起参与探讨交流~ 本文目录&#xff1a; 一、实验要求二、实验环境三、实验原理及操作1.照片准备2.图像增强3.实现美颜功能4.背景虚化5.图像二值化处理6.人…

item_password-获得淘口令真实url

一、接口参数说明&#xff1a; item_password-获得淘口令真实url &#xff0c;点击更多API调试&#xff0c;请移步注册API账号点击获取测试key和secret 公共参数 请求地址: https://api-gw.onebound.cn/taobao/item_password 名称类型必须描述keyString是调用key&#xff08…

tomcat源码修改与编译

1、获取源码 从github下载其源码&#xff1a;https://github.com/apache/tomcat 2、选择版本 切换到对应版本&#xff08;直接用相对应的Git tag即可&#xff09;&#xff1a; git checkout 9.0.793、修改源代码&#xff0c;并且生成补丁 这里我们以修改去掉新版本的ws的检…

129.【Spring 注解 IOC】

Spring 注解 (一)、组件注册1. Configuration 与 Bean 容器注册组件(1).无注解注入方式(2).注解注入方式 2. ComponentScan 自动扫描组件和自动扫描规则(1).无注解扫描方式(2).注解扫描注入方式(3).指定扫描或不扫描的包 (过滤) 3. 自定义TypeFilter指定过滤规则 Filter(1).自定…

QT多屏显示程序

多屏显示的原理其实很好理解&#xff0c;就拿横向扩展来说&#xff1a; 计算机把桌面的 宽度扩展成了 w1&#xff08;屏幕1的宽度&#xff09; w2(屏幕2的宽度) 。 当一个窗口的起始横坐标 > w1&#xff0c;则 他就被显示在第二个屏幕上了。 drm设备可以多用户同时打开&am…

Spring MVC 简介

目录 1. 什么是MVC2. 什么是SpringMVC 1. 什么是MVC MVC是一种常用的软件架构模式。可以看作是一种设计模式&#xff0c;也可以看作是一种软件框架。经典MVC模式中&#xff0c;M是指模型&#xff0c;V是视图&#xff0c;C则是控制器&#xff0c;使用MVC的目的是将M和V的实现代…

golang中使用chan控制协程并发简单事例

func main() {processNum : 5ch : make(chan struct{}, processNum)for true {ch <- struct{}{}go func() {defer func() {<-ch}()fmt.Println("我是协程", time.Now().UnixNano())time.Sleep(time.Second * 5)}()} } 可以看到&#xff0c;这里每5s会执行一次带…

Linux15 消息队列 线程

目录 1、进程间通信IPC&#xff1a; 2、多线程 3、向消息队列中写入数据 4、从消息队列中读取数据 5、多线程&#xff1a; 6、将多线程的数据返回给主…

数据库索引优化策略与性能提升实践

文章目录 什么是数据库索引&#xff1f;为什么需要数据库索引优化&#xff1f;数据库索引优化策略实践案例&#xff1a;索引优化带来的性能提升索引优化规则1. 前导模糊查询不适用索引2. 使用IN优于UNION和OR3. 负向条件查询不适用索引4. 联合索引最左前缀原则5. 范围条件查询右…

【Mysql】MVCC版本机制的多并发

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

PostgreSQL空值的判断

PostgreSQL空值的判断 空值判断非空判断总结 空值判断 -- 查询为空的 is null,sql简写isnull select * from employees where manager_id isnull;select * from employees where manager_id is null;非空判断 -- 查询不为空的 is not null;sql简写notnull select * from empl…

Java【数据结构】二分查找

&#x1f31e; 题目&#xff1a; &#x1f30f;在有序数组A中&#xff0c;查找目标值target &#x1f30f;如果找到返回索引 &#x1f30f;如果找不到返回-1 算法描述解释前提给定一个内含n个元素的有序数组A&#xff0c;满足A0<A1<A2<<An-1,一个待查值target1设…

mysql 8.0安装

操作系统&#xff1a;22.04.1-Ubuntu apt 安装命令 sudo apt install mysql-client-core-8.0 sudo apt install mysql-server-8.0终端输入 mysql 可以直接免密登录 如果此时提示需要密码&#xff0c;则可以进入配置文件&#xff0c;设置免密登录 sudo vim /etc/mysql/mysq…

【探索Linux】—— 强大的命令行工具 P.5(yum工具、git 命令行提交代码)

阅读导航 前言一、软件包管理器 yum1.yum的概念yum的基本指令使用例子 二、git 命令行提交代码总结温馨提示 前言 前面我们讲了C语言的基础知识&#xff0c;也了解了一些数据结构&#xff0c;并且讲了有关C的一些知识&#xff0c;也学习了一些Linux的基本操作&#xff0c;也了…

20W IP网络吸顶喇叭 POE供电吸顶喇叭

SV-29852T 20W IP网络吸顶喇叭产品简介 产品用途&#xff1a; ◆室内豪华型吸顶喇叭一体化网络音频解码扬声器&#xff0c;用于广播分区音频解码、声音还原作用 ◆应用场地如火车站、地铁、教堂、工厂、仓库、公园停车场等&#xff1b;室内使用效果均佳。 产品特点&#xff…

pytorch_lightning报错 You requested gpu: [1],But your machine only has: [0]

pytorch_lightning报错 You requested gpu: [1]&#xff0c;But your machine only has: [0] 问题及分析 报错图片如下&#xff1a; 分析 gpu:[1]指代的gpu的标号&#xff0c;如果笔记本中只包含一个GPU&#xff0c;一般序号为[0].所以无法找到程序指定的GPU。 解决方法 …

编程语言学习笔记-架构师和工程师的区别,PHP架构师之路

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责…

Egg.js构建一个stream流式接口服务

经常需要用到 stream 流式接口服务,比如&#xff1a;大文件下载、日志实时输出等等。本文将介绍如何使用Egg.js构建一个 stream 流式接口服务。 一、准备工作 目录结构&#xff1a; app//controllerindex.jstest.txttest.shindex.js 控制器test.txt 测试文件&#xff0c;最好…

5G+AI数字化智能工厂建设解决方案PPT

导读&#xff1a;原文《5GAI数字化智能工厂建设解决方案》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。数字化智能工厂定义 智能基础架构协同框架 - 端、边、云、网…

激光雷达 01 线数

一、线数 对于 360 旋转式和一维转镜式架构的激光雷达来说&#xff0c;有几组激光收发模块&#xff0c;垂直方向上就有几条线&#xff0c;被称为线数。这种情况下&#xff0c;线数就等同于激光雷达内部激光器的数量[参考]。 通俗来讲&#xff0c;线数越高&#xff0c;激光器的…