文件对象
yuhuo2021-05-16JavaScriptJavaScript对象
ArrayBuffer 类
1. 创建对象
// 创建指定字节长度的二进制对象
var buffer1 = new ArrayBuffer(8);
// 从Blob对象获取
var blob = new Blob(["文本内容"], { type: "text/plain" });
blob.arrayBuffer().then(function(buffer) {
var buffer2 = buffer;
})
// 从类型化数组获取
var array = new Int8Array([1, 2, 3]);
var buffer3 = array.buffer;
// 从base64字符串获取??
// 从本地文件获取??
2. 静态方法
静态方法 | 描述 |
---|---|
isView(arg: any): boolean | 返回参数是否是 ArrayBuffer 的视图实例 (类型化数组对象或 DataView 对象) |
3. 原型属性
原型属性 | 类型 | 描述 |
---|---|---|
byteLength | number | 返回字节长度 |
4. 原型方法
原型方法 | 描述 |
---|---|
slice(begin: number, end?: number): ArrayBuffer | 返回包含指定字节范围的新 ArrayBuffer 对象 |
TypeArray 类
说明
类型化数组用于描述一个 ArrayBuffer 对象的视图,其属性方法与 Array 数组基本相同,故以下只记录不一样的属性方法。
TypeArray 并没有暴露到全局属性,即代码中只需要使用其子类,直接使用 TypeArray 会报错。
1. 子类
类名 | 描述 | 元素字节长度 | 元素范围 |
---|---|---|---|
Int8Array | 8 位有符号整数 | 1 | -2^7 至 2^7-1 |
Uint8Array | 8 位无符号整数 | 1 | 0 至 2^8-1 |
Uint8ClampedArray | 8 位无符号整数(超出范围后为边界值) | 1 | 0 至 2^8-1 |
Int16Array | 16 位有符号整数 | 2 | -2^15 至 2^15-1 |
Uint16Array | 16 位无符号整数 | 2 | 0 至 2^16-1 |
Int32Array | 32 位有符号整数 | 4 | -2^31 至 2^31-1 |
Uint32Array | 32 位无符号整数 | 4 | 0 至 2^32-1 |
BigInt64Array | 64 位有符号整数 | 8 | -2^63 至 2^63-1 |
BigUint64Array | 64 位无符号整数 | 8 | 0 至 2^64-1 |
Float32Array | 32 位有符号浮点数(7 位有效数字) | 4 | -3.4E38 到 3.4E38 |
Float64Array | 64 位有符号浮点数(16 位有效数字) | 8 | -1.8E308 到 1.8E308 |
2. 创建对象
// 空类型化数组
var arr1 = new Int8Array();
// 长度为20的类型化数组
var arr2 = new Int8Array(20);
// 复制类型化数组或Array数组
var arr3 = new Int16Array(arr2);
// ArrayBuffer对象作为参数创建类型化数组
var buffer = new ArrayBuffer(20);
// new Int8Array(buffer[, byteOffset, length]);
var arr4 = new Int8Array(buffer, 2, 10);
3.原型属性
原型属性 | 类型 | 描述 |
---|---|---|
length | number | 返回数组长度 |
byteLength | number | 返回字节长度 |
buffer | ArrayBuffer | 返回关联 ArrayBuffer 对象 |
byteOffset | number | 返回当前对象在关联 ArrayBuffer 对象中的字节偏移量 |
4. 原型方法
原型方法 | 描述 |
---|---|
set(array: ArrayLike<number>, offset?: number): void | 从另一个数组复制值 |
subarray(begin?: number, end?: number): T | 返回包含指定元素范围的新的类型数组 |
[Symbol.iterator](): IterableIterator | 返回数组元素的迭代器对象 |
DataView 类
1. 创建对象
// ArrayBuffer对象作为参数创建数据视图对象
var buffer = new ArrayBuffer(20);
// new DataView(buffer[, byteOffset, length]);
const view1 = new DataView(buffer);
const view2 = new DataView(buffer, 12, 4);
2.原型属性
原型属性 | 类型 | 描述 |
---|---|---|
byteLength | number | 返回字节长度 |
buffer | ArrayBuffer | 返回关联 ArrayBuffer 对象 |
byteOffset | number | 返回当前对象在关联 ArrayBuffer 对象中的字节偏移量 |
3. 原型方法
原型方法 | 描述 |
---|---|
setInt8(offset: number, value: number): void | 设置 8 位有符号整数 offset:偏移量 value:值 |
getInt8(offset: number): number | 获取 8 位有符号整数 |
setUint8(offset: number, value: number): void | 设置 8 位无符号整数 |
getUint8(offset): number | 获取 8 位无符号整数 |
setInt16(offset: number, value: number, littleEndian?: boolean): void | 设置 16 位有符号整数 littleEndian:是否低位优先(默认 false) |
getInt16(offset: number, littleEndian?: boolean): number | 获取 16 位有符号整数 |
setUint16(offset: number, value: number, littleEndian?: boolean): void | 设置 16 位无符号整数 |
getUint16(offset: number, littleEndian?: boolean): number | 获取 16 位无符号整数 |
setInt32(offset: number, value: number, littleEndian?: boolean): void | 设置 32 位有符号整数 |
getInt32(offset: number, littleEndian?: boolean): number | 获取 32 位有符号整数 |
setUint32(offset: number, value: number, littleEndian?: boolean): void | 设置 32 位无符号整数 |
getUint32(offset: number, littleEndian): number | 获取 32 位无符号整数 |
setFloat32(offset: number, value: number, littleEndian?: boolean): void | 设置 32 位有符号浮点数 |
getFloat32(offset: number, littleEndian?: boolean): number | 获取 32 位有符号浮点数 |
setFloat64(offset: number, value: number, littleEndian?: boolean): void | 设置 64 位有符号浮点数 |
getFloat64(offset: number, littleEndian?: boolean): number | 获取 64 位有符号浮点数 |
Blob 类
1. 创建对象
// new Blob(array[, options])
// array:ArrayBuffer,TypeArray,DataView,Blob,String 等对象构成的 Array
var blob = new Blob(["文本内容"], {
type : "text/plain", // MIME类型
endings: "transparent", // 行结束符:transparent 不变(默认值),native 根据操作系统更改
});
2. 原型属性
原型属性 | 类型 | 描述 |
---|---|---|
type | string | 返回 MIME 类型 |
size | number | 返回字节大小 |
3. 原型方法
原型方法 | 描述 |
---|---|
slice(start?: number, end?: number, contentType?: string): Blob | 返回包含指定字节范围的新 Blob 对象 |
text(): Promise<string> | 返回文本作为回调参数的 Promise 对象 |
arrayBuffer(): Promise<ArrayBuffer> | 返回 ArrayBuffer 对象作为回调参数的 Promise 对象 |
stream(): ReadableStream<any> | 返回能读取 blob 内容的 ReadableStream 对象 |
File 类
继承了 Blob 类。
1. 创建对象
// 构建函数 new File() 参考 new Blob()
// 通过input[type=file]选择的文件
var file = document.querySelector("input[type=file]").files[0];
// 通过拖拽选择的文件
document.querySelector(".box").addEventListener("drop",function(event){
var file = event.dataTransfer.files[0];
});
2. 原型属性
原型属性 | 类型 | 描述 |
---|---|---|
name | string | 文件名 |
lastModified | number | 返回文件最后修改时间(毫秒时间戳) |
lastModifiedDate | Date | 返回文件最后修改时间的 Date 对象 |
webkitRelativePath | string | 返回文件相关的路径 |
FileList 类
1. 获取对象
var files = document.getElementById('fileInput').files;
2. 原型属性
原型属性 | 类型 | 描述 |
---|---|---|
length | number | 返回文件数量 |
[index] | File | 返回指定序号的 File 对象 |
3. 原型方法
原型方法 | 描述 |
---|---|
item(index: number): File | 返回指定序号的 File 对象 |
FileReader 类
继承了 EventTarget 类。
1. 创建对象
var reader = new FileReader();
2. 静态属性
静态属性 | 类型 | 描述 |
---|---|---|
EMPTY | number | 返回 0,表示没有读取任何文件 |
LOADING | number | 返回 1,表示文件正在被读取 |
DONE | number | 返回 2,表示已完成文件读取 |
3. 原型属性
原型属性 | 类型 | 描述 |
---|---|---|
EMPTY | number | 返回 0,表示没有读取任何文件 |
LOADING | number | 返回 1,表示文件正在被读取 |
DONE | number | 返回 2,表示已完成文件读取 |
============== | ============== | ============== |
result | string | ArrayBuffer | 返回读取结果 |
readyState | number | 返回读取状态 |
error | DOMException | 返回在读取文件时发生错误的 DOMException 对象 |
============== | ============== | ============== |
onloadstart | Function | 加载开始事件回调 |
onprogress | Function | 加载中事件回调 |
onload | Function | 加载成功事件回调 |
onabort | Function | 加载中止事件回调 |
onerror | Function | 错误事件回调 |
onloadend | Function | 加载结束事件回调 |
4. 原型方法
原型方法 | 描述 |
---|---|
readAsArrayBuffer(blob: Blob): void | 读取文件为 ArrayBuffer 对象 |
readAsDataURL(blob: Blob): void | 读取文件为 DataURL 字符串 |
readAsText(blob: Blob, encoding?: string): void | 读取文件为文本 |
abort(): void | 中止文件读取 |
说明
读取操作无返回值,读取的数据需要在 ProgressEvent 事件回调中,通过来 result 属性获取。
FormData 类
1. 创建对象
// new FormData(form?: HTMLFormElement)
var formData = new FormData();
2. 原型方法
原型方法 | 描述 |
---|---|
append(name: string, value: string | Blob, fileName?: string): void | 添加键值对(即使原本存在相同键名,也不会覆盖,而且新增) |
set(name: string, value: string | Blob, fileName?: string): void | 添加 / 修改键值对 |
get(name: string): string | Blob | 返回指定键名对应的第一个值 |
getAll(name: string): (string |Blob)[] | 返回指定键名对应的值的数组 |
has(name: string): boolean | 返回是否存在指定键名 |
delete(name: string): void | 删除指定键名 |
keys(): IterableIterator | 返回 name 的迭代器对象 |
values(): IterableIterator | 返回 value 的迭代器对象 |
entries(): IterableIterator | 返回 [name , value] 的迭代器对象 |
[Symbol.iterator](): IterableIterator | 同 entries() |
MediaStream 类
媒体流 (MediaStream) - Web API 接口参考 | MDN (mozilla.org)
1. 创建对象
// 空对象
var stream1 = new MediaStream();
// steam:另一个 MediaStream 对象
var stream2 = new MediaStream(stream);
// tracks:MediaStreamTrack 对象数组
var stream3 = new MediaStream(tracks);
// 获取用户本地摄像机和麦克风的实时媒体流
navigator.mediaDevices
.getUserMedia({
audio: true,
video: true,
})
.then(function (stream) {
video.srcObject = stream;
video.play();
});
// 获取用户屏幕的实时媒体流
navigator.getDisplayMedia
.getUserMedia({
audio: true,
video: true,
})
.then(function (stream) {
video.srcObject = stream;
video.play();
});
// 获取画布的实时媒体流
canvas.captureStream().then(function (stream) {
video.srcObject = stream;
video.play();
});
2. 原型属性
原型属性 | 类型 | 描述 |
---|---|---|
active | boolean | 返回媒体流是否活动状态 |
id | string | 返回 36 个字符的媒体流 id |
onaddtrack | function | 添加轨道对象事件回调 |
onremovetrack | function | 移除轨道对象事件回调 |
3 原型方法
原型方法 | 描述 |
---|---|
clone(): MediaStream | 克隆一个新的 MediaStream 对象,拥有不同 id |
addTrack(track: MediaStreamTrack): void | 添加轨道对象,触发 addtrack 事件 |
removeTrack(track: MediaStreamTrack) | 移除轨道对象,触发 removetrack 事件 |
getTracks(): MediaStreamTrack[] | 返回当前媒体流中所有轨道对象 |
getAudioTracks(): MediaStreamTrack[] | 返回当前媒体流中所有音频轨道对象 |
getVideoTracks(): MediaStreamTrack[] | 返回当前媒体流中所有视频轨道对象 |
getTrackById(trackId: string): MediaStreamTrack | 返回当前媒体流中对应轨道对象 id 的轨道对象 |
MediaSource 类
MediaSource - Web API 接口参考 | MDN (mozilla.org)
1. 创建对象
var mediaSource = new MediaSource;
2. 静态方法
静态方法 | 描述 |
---|---|
isTypeSupported(type: string): boolean | 返回当前浏览器是否支持给定的 MIME 类型和(可选的)编解码器 |
3. 原型属性
原型属性 | 类型 | 描述 |
---|---|---|
sourceBuffers | SourceBufferList | 返回包含的 SourceBuffer 对象列表 |
activeSourceBuffers | SourceBufferList | 返回当前所选的 SourceBuffer 对象列表 |
duration | number | 获取或者设置当前媒体展示的时长,单位秒 |
readyState | string | 当前 MediaSource 的状态 closed:未关联媒体元素, open:已关联媒体元素并准备好接收 SourceBuffer 对象, ended:已关联媒体元素但流已被 MediaSource.endOfStream() 结束 |
4. 原型方法
原型方法 | 描述 |
---|---|
addSourceBuffer(type: string): SourceBuffer | 根据给定的 MIME 类型创建一个新的 SourceBuffer 对象,然后会将它追加到 MediaSource 的 SourceBuffers 列表中 |
removeSourceBuffer(sourceBuffer: SourceBuffer): void | 移除一个已关联的 SourceBuffer 对象 |
endOfStream(error?: string): void | 结束流。 error 取值:network 网络错误,decode 解码错误 |
5. 代码示例
const video = document.querySelector("video");
const mimeType = 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"';
if (MediaSource.isTypeSupported(mimeType)) {
const mediaSource = new MediaSource();
//console.log(mediaSource.readyState); // closed
video.src = URL.createObjectURL(mediaSource);
mediaSource.addEventListener("sourceopen", sourceOpen);
} else {
console.log("不支持mimeType:" + mimeType);
}
function sourceOpen() {
//console.log(this.readyState); // open
const mediaSource = this;
const sourceBuffer = mediaSource.addSourceBuffer(mimeType);
sourceBuffer.addEventListener("updateend", function () {
mediaSource.endOfStream();
video.play();
console.log(mediaSource.readyState); // ended
});
const xhr = new XMLHttpRequest();
xhr.open("get", "../../static/video/frag_bunny.mp4");
xhr.responseType = "arraybuffer";
xhr.onload = function () {
sourceBuffer.appendBuffer(xhr.response);
};
xhr.send();
}