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

news/2024/5/9 11:17:31/文章来源:https://blog.csdn.net/qq_43886365/article/details/132355364

文章目录

    • 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.luyixian.cn/news_show_159111.aspx

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

相关文章

微信公众平台发布小程序流程

最近因为部署小程序&#xff0c;学习了下如何部署小程序 1. 取消不检验合法域名并上传小程序 建议在小程序上传之前&#xff0c;先取消不校验合法域名并真机调试下。 2. 登录微信公众平台 登录微信公众平台 3. 设置服务器域名 在开放->开发管理->开发设置找到服务器…

三维重建_基于图像的三维重建_面片/光度一致性

参考: 深蓝学院 基于图像的三维重建 1. 三维重建的流程回顾 基于深度图的三维重建:从无序图像获取稀疏点云和位姿,然后进行多视角立体重建。 多视角立体重建包含:(输入稀疏点云、各个图像位姿、图像)先进行立体对(3D-2D,2D-2D)的选择,然后计算深度图,接着进行深度图…

【C语言】C语言用数组算平均数,并输出大于平均数的数

题目 让用户输入一系列的正整数&#xff0c;最后输入“-1”表示输入结束&#xff0c;然后程序计算出这些数的平均数&#xff0c;最后输出输入数字的个数和平均数以及大于平均数的数 代码 #include<stdio.h> int main() {int x;double sum 0;int cnt 0;int number[100…

使用 AI 将绘画和照片转换为动画

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可二次编辑器的3D应用场景 华盛顿大学和Facebook的研究人员最近发表了一篇论文&#xff0c;展示了一种基于深度学习的系统&#xff0c;可以将静止图像和绘画转换为动画。称为照片唤醒的算法使用卷积神经网络从单个静止图像以 …

WPF入门到精通:1.新建项目及项目结构

WPF&#xff08;Windows Presentation Foundation&#xff09;是一种用于创建 Windows 应用程序的技术&#xff0c;它可以通过 XAML&#xff08;Extensible Application Markup Language&#xff09;和 C# 或其他 .NET 语言来实现。WPF 提供了许多强大的 UI 控件和样式&#xf…

如何找到一个数的所有质因数,以及如何快速判断一个数是不是质数

前情介绍 今天遇到一个需求&#xff1a;找到一个数所有的质因数。 初步解决 先定义一个判断质数的函数&#xff1a; def is_Prime(number):i 2count 0while i < number:if number % i 0 :count 1i 1if count > 0:return Falseelse:return True 接着定义一个寻找质…

Java-图书登录系统的实现

实现效果 它将面对 管理员 和 普通用户 两种用户来提供服务&#xff0c;并且各自的服务并不相同。 实现思路 一般写项目&#xff0c;每个独立的功能都会写成一个类&#xff0c;而有关联的功能&#xff0c;都会将多个类存放在一个包中&#xff0c;此项目我们将用 3 个包来体现我…

链表之第三回

欢迎来到我的&#xff1a;世界 该文章收入栏目&#xff1a;链表 希望作者的文章对你有所帮助&#xff0c;有不足的地方还请指正&#xff0c;大家一起学习交流 ! 目录 前言第一题&#xff1a;判断是否为环形链表第二题&#xff1a;找到两条链表的相交点第三题&#xff1a;返回…

P17~P18 电路定理 电路中难得的精彩到极致的电路理论

特勒根定理、互易定理、对偶定理比较难&#xff0c;非常重要&#xff0c;因为他们可以解决其他定理无法解决的问题。 1、特勒根定理1——个人感觉像能量守恒 特勒根定理与基尔霍夫定理齐名&#xff0c;与拓扑结构有关。都适用于任何线性非线性&#xff0c;时变的非时变的元件…

分类预测 | MATLAB实现S4VM半监督支持向量机二分类预测

分类预测 | MATLAB实现S4VM半监督支持向量机二分类预测 目录 分类预测 | MATLAB实现S4VM半监督支持向量机二分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 分类预测 | MATLAB实现S4VM半监督支持向量机二分类预测 程序设计 完整源码和数据获取方式&#xff1a; …

网站老域名跳转到新域名有哪些方法?内网穿透内网主机让外网访问

在网站服务器变更及本地主机搭建时&#xff0c;我们经常会遇到老域名地址跳转到新URL的配置&#xff0c;一些朋友还会面对无公网IP让外网访问的问题。今天我们来了解下网站老域名跳转到新域名有哪些方法&#xff0c;以及如何通过内网穿透实现内网主机让外网访问。 网站老域名跳…

Mac上传项目源代码到GitHub的修改更新

Mac上传项目源代码到GitHub的修改更新 最近在学习把代码上传到github&#xff0c;不得不说&#xff0c;真的还挺方便 这是一个关于怎样更新项目代码的教程。 首先&#xff0c;在本地终端命令行打开至项目文件下第一步&#xff1a;查看当前的git仓库状态&#xff0c;可以使用git…

线上异常的处理

一、线上问题的排查 进程ID 简称为PID free -m 查看内存使用情况 iostat 查看磁盘读写活动情况 netstat 查看网络连接情况 df -h 查看磁盘空间使用情况 du -sh 查看文件大小情况 1.1、top 命令查看CPU占用情况 top -n num 查看CPU占用最高的num个进程top -Hp PID 或 top -H -p…

【ROS】参数服务器--理论模型与参数操作(C++)

一、概念介绍 参数服务器在ROS中主要用于实现不同节点之间的数据共享。参数服务器相当于是独立于所有节点的一个公共容器&#xff0c;可以将数据存储在该容器中&#xff0c;被不同的节点调用&#xff0c;当然不同的节点也可以往其中存储数据。 作用&#xff1a;存储一些多节点…

【MySQL系列】SQL语句入门(创建删除操作)、字符集和数据类型详解

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

HummingBird 基于 Go 开源超轻量级 IoT 物联网平台

蜂鸟&#xff08;HummingBird&#xff09; 是 Go 语言实现的超轻量级物联网开发平台&#xff0c;包含设备接入、产品管理、物模型、告警中心、规则引擎等丰富功能模块。系统采用GoLang编写&#xff0c;占用内存极低&#xff0c; 单物理机可实现百设备的连接。 在数据存储上&…

就算没有那个所谓的“国产保护月”,好莱坞电影也打不过中国电影

据路透社、美国文娱杂志《Variety》网站等18日报道&#xff0c;中国大陆暑期档票房在17日就已经超过了2019年同期的178亿元人民币&#xff0c;提前14天锁定了“史上最强暑期档”。这一份傲人的成绩单中&#xff0c;西方好莱坞电影所起到的作用却“微乎其微”。 更令人尴尬的是…

AI项目二:基于mediapipe的虚拟绘画

若该文为原创文章&#xff0c;转载请注明原文出处。 一、项目介绍 随着人工智能时代的到来&#xff0c;许多技术得到了空前的发展&#xff0c;让人们更加认识到了线上虚拟技术的强大。 通过mediapipe识别手的关键点&#xff0c;检测中指&#xff0c;实现隔空画画的操作。 通…

【LeetCode-中等题】128. 最长连续序列

题目 题解一&#xff1a;HeshSet枚举 思路&#xff1a;先对数组进行set去重&#xff0c;核心就是&#xff0c;先找出临界值&#xff08;假设以最小临界为例&#xff0c;那么这个临界值自己就是最小值&#xff0c;&#xff09;&#xff0c;以临界值不断做加1操作&#xff0c;看…