文件对象

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. 原型属性

原型属性类型描述
byteLengthnumber返回字节长度

4. 原型方法

原型方法描述
slice(begin: number, end?: number): ArrayBuffer返回包含指定字节范围的新 ArrayBuffer 对象

TypeArray 类

说明

类型化数组用于描述一个 ArrayBuffer 对象的视图,其属性方法与 Array 数组基本相同,故以下只记录不一样的属性方法。

TypeArray 并没有暴露到全局属性,即代码中只需要使用其子类,直接使用 TypeArray 会报错。

1. 子类

类名描述元素字节长度元素范围
Int8Array8 位有符号整数1-2^7 至 2^7-1
Uint8Array8 位无符号整数10 至 2^8-1
Uint8ClampedArray8 位无符号整数(超出范围后为边界值)10 至 2^8-1
Int16Array16 位有符号整数2-2^15 至 2^15-1
Uint16Array16 位无符号整数20 至 2^16-1
Int32Array32 位有符号整数4-2^31 至 2^31-1
Uint32Array32 位无符号整数40 至 2^32-1
BigInt64Array64 位有符号整数8-2^63 至 2^63-1
BigUint64Array64 位无符号整数80 至 2^64-1
Float32Array32 位有符号浮点数(7 位有效数字)4-3.4E38 到 3.4E38
Float64Array64 位有符号浮点数(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.原型属性

原型属性类型描述
lengthnumber返回数组长度
byteLengthnumber返回字节长度
bufferArrayBuffer返回关联 ArrayBuffer 对象
byteOffsetnumber返回当前对象在关联 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.原型属性

原型属性类型描述
byteLengthnumber返回字节长度
bufferArrayBuffer返回关联 ArrayBuffer 对象
byteOffsetnumber返回当前对象在关联 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. 原型属性

原型属性类型描述
typestring返回 MIME 类型
sizenumber返回字节大小

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. 原型属性

原型属性类型描述
namestring文件名
lastModifiednumber返回文件最后修改时间(毫秒时间戳)
lastModifiedDateDate返回文件最后修改时间的 Date 对象
webkitRelativePathstring返回文件相关的路径

FileList 类

1. 获取对象

var files = document.getElementById('fileInput').files;

2. 原型属性

原型属性类型描述
lengthnumber返回文件数量
[index]File返回指定序号的 File 对象

3. 原型方法

原型方法描述
item(index: number): File返回指定序号的 File 对象

FileReader 类

继承了 EventTarget 类

1. 创建对象

var reader = new FileReader();

2. 静态属性

静态属性类型描述
EMPTYnumber返回 0,表示没有读取任何文件
LOADINGnumber返回 1,表示文件正在被读取
DONEnumber返回 2,表示已完成文件读取

3. 原型属性

原型属性类型描述
EMPTYnumber返回 0,表示没有读取任何文件
LOADINGnumber返回 1,表示文件正在被读取
DONEnumber返回 2,表示已完成文件读取
==========================================
resultstring | ArrayBuffer返回读取结果
readyStatenumber返回读取状态
errorDOMException返回在读取文件时发生错误的 DOMException 对象
==========================================
onloadstartFunction加载开始事件回调
onprogressFunction加载中事件回调
onloadFunction加载成功事件回调
onabortFunction加载中止事件回调
onerrorFunction错误事件回调
onloadendFunction加载结束事件回调

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](): IterableIteratorentries()

MediaStream 类

媒体流 (MediaStream) - Web API 接口参考 | MDN (mozilla.org)open in new window

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. 原型属性

原型属性类型描述
activeboolean返回媒体流是否活动状态
idstring返回 36 个字符的媒体流 id
onaddtrackfunction添加轨道对象事件回调
onremovetrackfunction移除轨道对象事件回调

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)open in new window

1. 创建对象

var mediaSource = new MediaSource;

2. 静态方法

静态方法描述
isTypeSupported(type: string): boolean返回当前浏览器是否支持给定的 MIME 类型和(可选的)编解码器

3. 原型属性

原型属性类型描述
sourceBuffersSourceBufferList返回包含的 SourceBuffer 对象列表
activeSourceBuffersSourceBufferList返回当前所选的 SourceBuffer 对象列表
durationnumber获取或者设置当前媒体展示的时长,单位秒
readyStatestring当前 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();
}
Last Updated 2024/3/14 09:51:53