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

文章目录

    • 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);
        // 先转为base64
        let 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数据转换为Blob
          var 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类型 涉及到异步 所以要用 promise
        let 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类型 涉及到异步 所以要用 promise
        let blob = await fileToBlob(file);
        console.log("blob:", blob);
      };

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

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

  /**
   * 获取文件(图片视频等)的本地内存地址 可以直接访问
   * @param file  该文件的文件流
   */
  export function createObjectURLFun(file) {
    let url = '';
    if (window.createObjectURL != undefined) {
      // basic
      url = window.createObjectURL(file);
    } else if (window.URL != undefined) {
      // mozilla(firefox)
      url = window.URL.createObjectURL(file);
    } else if (window.webkitURL != undefined) {
      // webkit or chrome
      url = 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';
      }
      // 第二版 dataLoad
      video.addEventListener(listen, () => {
        console.log("我走了");
        canvas.width = width;
        canvas.height = height;
        canvas.getContext('2d').drawImage(video, 0, 0, width, height); //绘制canvas
        dataURL = canvas.toDataURL('image/jpeg'); //转换为base64
        resolve(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 ()方法返回的文件;

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

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

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

相关文章

qt显示图片并转换成灰度图及伪彩图

写了个程序&#xff0c;可在途图片&#xff0c;并切换成灰度图及伪彩图显示&#xff0c;主要代码如下&#xff1a; #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainW…

vlan实验

配置 r1 sw1 sw2

回归预测 | MATLAB实现GA-RBF遗传算法优化径向基函数神经网络多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现GA-RBF遗传算法优化径向基函数神经网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现GA-RBF遗传算法优化径向基函数神经网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果…

all in one之安装pve(第一章)

第一章 安装PVE PVE安装 pverufusultraISO下载地址下载地址下载地址 因为我使用的是SD卡存储&#xff0c;尝试rufus安装失败&#xff0c;建议使用 ultraISO进行镜像写入。 U盘推荐4G往上。 下载pve 我下载的pve版本是7.4 ultraISO 把镜像写入u盘 下载完成后需要把镜像文件…

Datawhale Django后端开发入门 Vscode TASK02 Admin管理员、外键的使用

一.Admin管理员的使用 1、启动django服务 使用创建管理员之前&#xff0c;一定要先启动django服务&#xff0c;虽然TASK01和TASK02是分开的&#xff0c;但是进行第二个流程的时候记得先启动django服务&#xff0c;注意此时是在你的项目文件夹下启动的&#xff0c;时刻注意要执…

vue:this和that的理解

当我们进入公司的时候会发现一个很常见的情况&#xff0c;就是你的前开发者会常用这么一个变量&#xff1a;that、self… 为什么会用到that、self呢&#xff0c;小编是这么理解的&#xff0c;this指向的是当前的对象&#xff0c;而that、self是临时的变量&#xff0c;为了临时存…

水果成篮(力扣)双指针滑动窗口 JAVA

你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而&#xff0c;农场的主人设定了一些严格的规矩&#xff0c;你必须按照要求采摘水果&…

三重奏的和谐:如何完美对齐公司、部门与个人目标

引言 在企业的运营和管理中&#xff0c;目标的设定与对齐是至关重要的。它不仅决定了公司的方向和愿景&#xff0c;还影响到每一个部门和团队成员的工作内容和效果。如何确保公司目标、部门目标和团队个人目标之间的完美对齐&#xff0c;是每一个管理者都需要面对的挑战。 目…

JDK中的Timer总结

目录 一、背景介绍二、思路&方案三、过程1.Timer关键类图2.Timer的基本用法3.结合面向对象的角度进行分析总结 四、总结五、升华 一、背景介绍 最近业务中使用了jdk中的Timer&#xff0c;通过对Timer源码的研究&#xff0c;结合对面向对象的认识&#xff0c;对Timer进行针…

从NLP到聊天机器人

一、说明 今天&#xff0c;当打电话给银行或其他公司时&#xff0c;听到电话另一端的机器人向你打招呼是很常见的&#xff1a;“你好&#xff0c;我是你的数字助理。请问你的问题。是的&#xff0c;机器人现在不仅可以说人类语言&#xff0c;还可以用人类语言与用户互动。这是由…

获取excel中的图片(包含wps中嵌入单元格图片)

项目中有excel导入功能,并且需要导入excel中的图片;模板如图: 已知office中插入的图片为浮动形式;如图: wps中可以插入浮动图片,也可以插入嵌入单元格图片;如图: 并且在wps嵌入单元格形式的图片可以看到使用的是公式;如图: 问题来了,如何获取图片 并且将图片与单元格进行对应 …

Apache DolphinScheduler 支持使用 OceanBase 作为元数据库啦!

DolphinScheduler是一个开源的分布式任务调度系统&#xff0c;拥有分布式架构、多任务类型、可视化操作、分布式调度和高可用等特性&#xff0c;适用于大规模分布式任务调度的场景。目前DolphinScheduler支持的元数据库有Mysql、PostgreSQL、H2&#xff0c;如果在业务中需要更好…

【GitHub】Pycharm本地项目打包上传到Github仓库的操作步骤

文章目录 1、Pycharm端的设置操作2、Github端的设置操作3、Pycharm上配置Github4、Git本地项目至GitHub仓库5、前往Github中查看确认6、常见报错 1、Pycharm端的设置操作 通过CtrlAltS快捷组合键的方式&#xff0c;打开设置&#xff0c;导航到版本控制一栏中的Git&#xff0c;…

LTPP在线开发平台【使用教程】

LTPP在线开发平台 点击访问 LTPP在线开发平台 LTPP&#xff08;Learning teaching practice platform&#xff09;在线开发平台是一个编程学习网站&#xff0c;该网站集文章学习、短视频、在线直播、代码训练、在线问答、在线聊天和在线商店于一体&#xff0c;专注于提升用户编…

QT处理日志文件

由于实际生产需要&#xff0c;软件系统的运行&#xff0c;会产生大量的日志文件&#xff0c;有时候一天就能产生超过百万条log记录&#xff0c;那么为了能够处理日志文件&#xff0c;查询并且找到我们想要的报错信息&#xff0c;因此不得不考虑怎么实现&#xff0c;打开大日志文…

i.MX6ULL开发板无法进入NFS挂载文件系统的解决办法

问题 使用NFS网络挂载文件系统后卡住无法进入系统。 解决办法 此处不详细讲述NFS安装流程 查看板卡挂载在/home/etc/rc.init下的自启动程序 进入到../../home/etc目录下&#xff0c;查看rc.init文件&#xff0c;首先从第一行排查&#xff0c;查看/home/etc/netcfg文件代码内容&…

回归预测 | MATLAB实现FA-SVM萤火虫算法优化支持向量机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现FA-SVM萤火虫算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现FA-SVM萤火虫算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本介绍…

阿里云故障洞察提效 50%,全栈可观测建设有哪些技术要点?

本文根据作者在「TakinTalks 稳定性社区 」公开分享整理而成 #一分钟精华速览# 全栈可观测是一种更全面、更综合和更深入的观测能力&#xff0c;能协助全面了解和监测系统的各个层面和组件&#xff0c;它不仅仅是一个技术上的概念&#xff0c;更多地是技术与业务的结合。在“…

Zoho Books的安全性和数据保护:财务信息安全的保障措施揭秘

在信息化时代&#xff0c;如何保障企业信息安全是十分重要的问题&#xff0c;尤其是财务信息。财务管理工具的安全性是否有保障是许多用户担心的问题。 Zoho Books财务管理工具为客户提供了一系列的数据保护和安全措施&#xff0c;以确保客户财务信息的安全。 1. 采用高度加密…

MySQL流程控制

流程控制 顺序结构&#xff1a; 程序从上往下依次执行分支结构&#xff1a; 程序按条件进行选择执行&#xff0c;从两条或多条路径中选择一条执行。循环结构&#xff1a; 程序满足一定条件下&#xff0c;重复执行一组语句 针对于MySQL的流程控制语句主要有3类。注意&#xff…