【JavaScript】如何转换blob数据与file文件还有url

news2024/9/20 0:53:46

大家好,关于blob对象和file对象有了解多少呢,它们都是一种文件的表示形式,文件之间是可以互相转换的,顺带一提,还有经常用到的临时文件路径tempFileURL

文章目录

  • 文件类型
  • Blob对象
  • File对象
  • URL临时路径

文件类型

首先,需要先知道文件类型有哪些,我们可以通过文件名后缀判断

常见的文件类型列表

文件后缀MIME类型说明
txttext/plain文本文件
htm, htmltext/htmlHTML文本
pdfapplication/pdfPDF文档
docapplication/mswordWord文档
pngimage/pngPNG图片
jpg, jpegmage/jpegJPEG图片
tarapplication/x-tarTAR文件
gzipapplication/x-gzipGZIP文件

Blob对象

了解一下,Blob对象有哪些属性,这是一个存储了二进制的原始数据文件,类似与File文件对象的只读文件,是临时存放的,方便缓存和处理文件

  • 文件类型 MIME type
  • 文件内容 base64 或 blobURL

创建一个blob对象

/**
* 文本转blob对象
* @param String text 文本内容
* @param String type MIME 类型
*/
function createObjectBlob(text,type='text/plain'){
	return new Blob([text], { type });
}

可将blob对象转file对象

/**
* blob转file对象
* @param String blob 对象
* @param String filename 文件名
* @param String type MIME 类型
*/
function createObjectFile(blob,filename,type='text/plain'){
	return new File([blob],filename,{ type });
}

可将blob对象转换临时文件l路径url

/**
* blob转url临时访问地址
* @param String blob 对象
*/
function createObjectURL(blob){
	return URL.createObjectURL(blob);
}

File对象

了解一下,File对象有哪些属性,我们知道,可通过选择文件上传用到的HTML标签<input type="file" />,从中可得到上传文件的File对象实例

  • 文件名 filename, 例如 readme.txt
  • 文件类型 MIME type
  • 文件内容

创建一个file对象

/**
* 文本转file对象
* @param String text 文本内容
* @param String filename 文件名
* @param String type MIME 类型
*/
function createObjectFile(text,filename,type='text/plain'){
	return new File([text],filename,{ type });
}

可将file对象转blob对象

/**
* file转blob对象
* @param String file 对象
*/
function createObjectBlob(file){
	return new Blob([file],{type:file.type});
}

将file对象转换为临时文件路径url

/**
* file转url临时访问地址
* @param String file 对象
*/
function createObjectURL(file){
	return URL.createObjectURL(file);
}

URL临时路径

了解一下,URL临时路径,还可以命名为TempFilePath,见名知意,是Blob对象的临时文件位置,用于访问文件资源

临时文件路径url可以转换为file对象

/**
* url临时访问地址转file对象
* @param { url, filename, type, success, fail } 临时地址,文件名,MIME类型,成功回调,失败回调
*/
function createObjectFile(e){
	const { url, filename } = e;
	const encode = e.encode || 'utf-8';
	const type = e.type || 'text/plain';
	let reader = new FileReader();
	reader.onloadend = () => {
		if(url.startsWith('data:') type=url.split(',')[0].match(/:(.*?);/)[1];
		let file = new File([reader.result],filename,{ type });
		e.success({ file });
	};
	if(e.fail) reader.onerror = e.fail;
	if(type.startsWith('text')) reader.readAsText(url, encode);//读取文本
	else if(type.startsWith('image')) reader.readAsDataURL(url, encode);//读出的是base64字符串 可赋值给标签img.src
	else reader.readAsArrayBuffer(url, encode);//读出的是ArrayBuffer对象
}

注意url如果是base64字符串(以data:开头)表示形式,字符串是会比较长,这可不是临时文件路径,这只是直接将文件内容转换为字符串编码,所以会看到字符串会比较长,这可不适用大文件处理哦,通常用于图标或图像文件处理和显示

临时文件路径url可以转换为blob对象

/**
* url临时访问地址转blob对象
* @param { url, success, fail } 临时地址,成功回调,失败回调
*/
function createObjectBlob(e){
	const { url } = e;
	try{
		if(url.startsWith('data:')){
			let arr = url.split(','),
				type = arr[0].match(/:(.*?);/)[1],
				bstr = atob(arr[1]),
				n = bstr.length,
				u8arr = new Uint8Array(n);
			while(n--) u8arr[n] = bstr.charCodeAt(n);
			e.success({
				blob: new Blob([u8arr], { type })
			});
		}else{
			let xhr = new XMLHttpRequest();
			xhr.responseType = 'blob';
			xhr.onload = () => e.success({
				blob: xhr.response
			});
			if(e.fail) xhr.onerror = e.fail;
			xhr.open('GET', url);
			xhr.send();
		}
	}catch(err){
		if(e.fail) e.fail(err)
	}
}

例如这样调用

createObjectBlob({
	url:'blob:http://localhost:...',
	success(res){
		const { blob } = res;
		//...
	}
})

注意临时文件路径url的表示形式

base64 例如 data:text/plain;base64,b2ZmaWNlMjAxOea/gOa0u+WvhumSpe…
blob 例如 blob:http://localhost:…

请添加图片描述

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

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

相关文章

c++ -- STL容器--vector

STL中最常用的容器为Vector&#xff0c;可以理解为数组#include <iostream> #include <vector> #include <algorithm> using namespace std;void myPrint(int val) {cout <<val<<endl; }//vector容器存放内置数据类型void test01() {//创建了一个…

数据库(tidb、clickhouse、hive)概念笔记

目录 1、有哪些分布式数据库 2、OLAP、OLTP、HTAP 3、TIDB、clickhouse、hive 一、TIDB 1. TiDb 核心特性&#xff1a; 2. TiDb 整体架构&#xff1a; 3.TiDB 存储&#xff1a; 二、clickhouse 三、hive 1.什么是 Hive&#xff1f; 2.Hive 架构和如何运作&#xff1…

KMP -- 代码求解next数组

代码求解next数组 1. KMP相关概念 前缀&#xff1a;包含首位字符但不包含末位字符后缀&#xff1a;包含末位字符但不包含首位字符next数字&#xff1a;主串与模式串不匹配时&#xff0c;模式串需要回退的位置next[j]&#xff1a;第 j 位字符前面的j-1位字符组成的字串的前后缀…

QGIS查看属性和选择要素

目录1. 查看属性和选择要素2. 调整图层样式&#xff0c;添加自动标注1. 查看属性和选择要素 #pic_center x400 暂时移除&#xff0c;不是删除&#xff0c;它还是存在它本来的位置&#xff0c;用的时候再次添加即可。 选择工具 点完工具后&#xff0c;点击图中一个点&#xf…

c++ -- STL容器--stack容器

5. stack容器5.1 简介① stack是一种先进后出的容器&#xff0c;它只有一个出口。② 栈中只有顶端的元素才可以被外界使用&#xff0c;因此栈不允许有遍历行为。③ 栈中进入数据称为&#xff1a;入栈 push④ 栈中弹出数据称为&#xff1a;出栈 pop5.2 常用接口① 功能描述&…

蓝桥杯STM32G431RBT6学习——GPIO

蓝桥杯STM32G431RBT6学习——GPIO GPIO外设分布 国信长天开发板使用的STM32G431RBT6为LQFP64的封装&#xff0c;可用的GPIO为49个&#xff0c;包括如下&#xff1a; PA0~PA15 PB0~PB15 PC0~PC15 PD2&#xff0c;PF0&#xff0c;PF1&#xff0c;PG10 其中PF0与PF1用于连接外部…

前端入门笔记 02 —— CSS

CSS标签通常要配合html或者js使用 CSS本身的构造 p{color : red}/*color 属性 red 值*//*p选择器 括号内内容 生命*/配合html <style>p{color : red}<\style>或者直接引入整个css文件 <head><style type text/css>import "1.3.css";<…

【vue组件之间的数据传递和组件的生命周期】一.组件之间的通信;二.组件的声明周期

目录 一.组件之间的通信 1.组件之间的关系&#xff1a;父子关系、兄弟关系、跨级关系 2.父子组件之间的通信&#xff08;数据传递&#xff09;&#xff1a; &#xff08;1&#xff09;父组件----》子组件&#xff1a;使用props &#xff08;2&#xff09;子组件----》父组件…

为什么互联网公司不欢迎中年人?

除开几个“越老越值钱”的岗位&#xff08;如医生、教师、建筑师&#xff09;外&#xff0c;大多数公司就是不欢迎中年人的。 你很难见到30岁的地推、40岁的销售、50岁的文员&#xff0c;但是20岁的年轻小伙一抓一大把&#xff0c;我们的互联网经济&#xff0c;就是建立在人口密…

RHEC——ansible配置yum源仓库

1.挂载本地光盘到/mnt 2.配置yum源仓库文件通过多种方式实现 1&#xff09;、仓库1 &#xff1a; Name: RH294_Base Description&#xff1a; RH294 base software Base urt: file:///mnt/BaseOS 不需要验证钦件包 GPG 签名 启用此软件仓库 2&#xff09;、仓库 2: Name: RH29…

立创eda专业版学习笔记(1)

之前那些博客对应的是立创eda标准版&#xff0c;版本号是6.5.4以前 最近开始使用专业版&#xff0c;原本以为专业版是标准版的基础上添加了些功能&#xff0c;现在才发现不是这么回事&#xff0c;专业版跟标准版在界面上的区别很大&#xff0c;几乎就是另外一个软件了&#xff…

外贸客户接待的基本环节有哪些?

外贸客户来了&#xff0c;接待人员一定要有耐心&#xff0c;那么怎么接待呢&#xff1f;以下是米贸搜为您整理的外贸客户接待流程。希望对你有帮助。外贸客户接待流程既然客人愿意来我们公司参观&#xff0c;他们一定有很大的诚意。但从这几年的案例来看&#xff0c;大部分来访…

JavaSE学习day1_01,计算机基础知识

学习正式开始&#xff1a; 学习之前先了解一些计算机基本常识&#xff1a; 1. CMD 1.1 什么是CMD&#xff1f; 先看一张图&#xff1a; 这是黑客大佬使用的命令。 这是现代计算机的图形化界面。学过操作系统的同学应该知道这是操作系统提供的一个接口&#xff0c;它严格意义…

ORB-SLAM2 --- KeyFrame::SetBadFlag函数

目录 1.函数作用 2.code 3.函数解析 1.函数作用 真正地执行删除关键帧的操作。 需要删除的是该关键帧和其他所有帧、地图点之间的连接关系。 2.code void KeyFrame::SetBadFlag() { // Step 1 首先处理一下删除不了的特殊情况{unique_lock<mutex> lock(mMutexConn…

visual studio控制台中文乱码问题

踩坑经历&#xff1a; 这是一个向文件中写入文字&#xff08;中文&#xff0c;在将文件中文字读取出来的代码。读取出来的结果是符号码。 这个问题在网上找了很多的解决办法&#xff0c;都没有完全解决。 其实要不出现乱码&#xff0c;就要保持控制台编码和源代码编码相一致就可…

照片恢复软件哪个好用?5个好用的照片恢复软件推荐

照片可以勾起回忆&#xff0c;让我们想起与最亲近的人一起度过的时光&#xff0c;这就是为什么仅仅丢失一张重要照片就会让人感觉完全毁灭性的——几乎就像你失去了记忆本身一样。好消息是&#xff0c;大多数丢失或意外删除的照片都可以使用照片恢复软件恢复&#xff0c;而且我…

XILLINX时钟约束相关说明

时钟说明 primary clock 基准时钟&#xff0c;primary这里有“基本的”更贴切&#xff0c;虽然其有“主要的、首要的、初级的、原发性的”意思。 提供的基准时钟有俩种情况&#xff1a; 时钟由外部时钟源提供&#xff0c;通过输入引脚进入FPGA&#xff1b;高速收发器(GT)的时…

Google编程规范

Google编程规范总结一、前言二、头文件三、类构造函数可拷贝类型和可移动类型struct和class接口存取控制和声明顺序四、来自Google的奇技所有权与智能指针cpplint五、其他C特性六、命名约定(重点)七、注释(重点)八、代码格式(重点)九、结束语一、前言 昨天听了雷军的演讲&#…

猪齿鱼知识沉淀

数据源知识沉淀 1、下拉框与Lov的注意点&#xff1a; 下拉框 {name: intertradeType,lookupCode: "HCMS.INTERTRADE_TYPE",label: intl.get(${prefix}.table.intertradeType).d(贸易性质),required: true, }, {name: intertradeTypeMeaning,label: intl.get(${pref…

2023 docker安装gitlab-ce

公司搭建私服git来管理代码。这里使用docker来安装gitlab&#xff0c;过程相对简单。需要服务器至少有4g内存。这里安装的gitlab-ce社区版。前提是安装了docker 安装gitlab-ce 下载镜像&#xff0c;等待下载… docker pull gitlab/gitlab-ce:latest建立了目录 /opt/docker/git…