目录filefile文件base64Blobblob的用法ArrayBufferArrayBuffer的使用FileReaderFileReader的使用二进制类型数据的互相转化fi
在js中有很多二进制数据,有file,base64,Blob,ArrayBuffer,FileReader。这些二进制数据在文件导出和下载的时候是经常会用到的,我们这篇文章就是介绍这些二进制数据以及它们之间的转化。
文件(File)接口提供有关文件的信息,并允许网页中的 javascript 访问其内容。实际上,File 对象是特殊类型的 Blob,且可以用在任意的 Blob 类型的 context 中。Blob 的属性和方法都可以用于 File 对象。
file文件一般有两种来源
<input>
元素上选择文件后返回的 FileList 对象;DataTransfer
对象;每个 File
对象都包含以下属性,这些属性都继承自 Blob 对象:
lastModified
:引用文件最后修改日期,为自1970年1月1日0:00以来的毫秒数;lastModifiedDate
:引用文件的最后修改日期;name
:引用文件的文件名;size
:引用文件的文件大小;type
:文件的媒体类型(MIME);WEBkitRelativePath
:文件的路径或 URL。Base64 是一种基于64个可打印字符来表示二进制数据的表示方法。Base64 编码普遍应用于需要通过被设计为处理文本数据的媒介上储存和传输二进制数据而需要编码该二进制数据的场景。这样是为了保证数据的完整并且不用在传输过程中修改这些数据。
Blob 对象表示一个不可变、原始数据的类文件对象。它的数据可以按文本或二进制的格式进行读取,也可以转换成 ReadableStream 来用于数据操作。
也就是说blob对象是原始二进制数据对象,是不可修改的。
new Blob(array, options);
array
:由 ArrayBuffer
、ArrayBufferView
、Blob
、DOMString
等对象构成的,将会被放进 Blob
;
options
:可选的 BlobPropertyBag
字典,它可能会指定如下两个属性
type
:默认值为 "",表示将会被放入到 blob
中的数组内容的 MIME 类型。
endings
:默认值为"transparent
",用于指定包含行结束符\n
的字符串如何被写入,不常用。
ArrayBuffer 对象用来表示通用的、固定长度的原始二进制数据缓冲区。ArrayBuffer 的内容不能直接操作,只能通过 DataView 对象或 TypedArrray 对象来访问。这些对象用于读取和写入缓冲区内容。
TypedArray:用来生成内存的视图,通过9个构造函数,可以生成9种数据格式的视图。
DataViews:用来生成内存的视图,可以自定义格式和字节序。
new ArrayBuffer(bytelength)
FileReader用于读取文件并提取其内容, 可以将 Blob 读取为不同的格式。
创建
const reader = new FileReader();
FileReader还有很多方法和事件,感兴趣的可以去MDN上查看。
let reader = new FileReader();
reader.readAsDataURL(file[0])
const base64toBlob = (base64Data, contentType, sliceSize) => {
const byteCharacters = atob(base64Data);
const byteArrays = [];
for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
const slice = byteCharacters.slice(offset, offset + sliceSize);
const byteNumbers = new Array(slice.length);
for (let i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
const blob = new Blob(byteArrays, {type: contentType});
return blob;
}
function blobToArrayBuffer(blob) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => resolve(reader.result);
reader.onerror = () => reject;
reader.readAsArrayBuffer(blob);
});
}
function blobToBase64(blob) {
return new Promise((resolve) => {
const reader = new FileReader();
reader.onloadend = () => resolve(reader.result);
reader.readAsDataURL(blob);
});
}
const blob = new Blob([new Uint8Array(buffer, byteOffset, length)]);
const base64 = btoa(String.fromCharCode.apply(null, new Uint8Array(arrayBuffer)));
const base64ConvertFile = function (urlData, filename) { // 64转file
if (typeof urlData != 'string') {
return;
}
let arr = urlData.split(',')
let type = arr[0].match(/:(.*?);/)[1]
let fileExt = type.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.' + fileExt, {
type: type
});
}
温馨提示:由于文章篇幅有限,关于几种二进制的详细用法可以去MDN查看。
以上就是js二进制数据及其互相转化实现详解的详细内容,更多关于js二进制数据互相转化的资料请关注编程网其它相关文章!
--结束END--
本文标题: js二进制数据及其互相转化实现详解
本文链接: https://lsjlt.com/news/197626.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-01-12
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0