vue3下自定义一个File对象:
在实际香红木开发过程中,有时候会用到 File 类型做文件的上传,一个标准的 File 对象,一般包含如下信息:
属性名 | 类型 | 说明
name | string | 文件名,例如 example.jpg
lastModified | number | 文件最后修改时间的时间戳(毫秒)
lastModifiedDate | Date(已废弃) | 已废弃的属性,请使用 lastModified
webkitRelativePath | string | 如果通过 <input webkitdirectory> 选择目录时的相对路径
size | number | 文件大小(字节数)
type | string | 文件 MIME 类型,例如 image/png、application/pdf
arrayBuffer() | Promise<ArrayBuffer> | 获取文件内容的 ArrayBuffer 表示
slice() | 方法 | 用于从文件中提取部分内容
stream() | 方法 | 返回一个可读的 ReadableStream,用于流式读取内容
text() | Promise<string> | 返回文件内容的文本形式(例如 .txt 文件)
但是有时候,我们可能需要自己定义一个 File 类型,比如定义了了一个其它的属性name2,这样代码是可以执行的,但是 ts 类型检查会报错,因为类型不一致. 为了解决这个问题,可以通过如下方式解决,
function createFakeFileWithSize(name: string, size: number, type: string): File {
const blobContent = new Uint8Array(size); // 此时的array大小就是这个 size 的大小
console.log("blobContent:", blobContent);
return new File([blobContent], name, {
type,
lastModified: Date.now(), // 可以不要,默认就是当前时间
});
}
console.log("fakeFile is:", createFakeFileWithSize("placeholder.pdf", 2048, "application/pdf"));
主要逻辑就是,将自定义的File, 重新伪造一个标准的File对象,这里通过 Uint8Array 生成一个 blod 对象,主要用来保存这个 size 的大小,不能之间诶给File对象传递sise,这个size和content大小,他表示的是[内容]数组的大小
所以这里通过这个blob对象模拟一个相同大小的size对象, 上面的 placeholder.pdf(可以是name2,这里赋值给标准File) 其实就是标准File的名称,application/pdf 为文件类型
//使用 Blod 声明一个blob对象
const blob = new Blob(["Hello World"], {
type: "text/plain"
});
console.log("blob is:", blob)
