网站首页 > 技术文章 正文
1. File
本质: 继承自Blob,表示用户文件系统中的文件
特性:
const file = new File(['content'], 'demo.txt', {
type: 'text/plain',
lastModified: Date.now()
});
console.log(file.name); // 'demo.txt'
console.log(file.size); // 7 (字节)
console.log(file.type); // 'text/plain'
2. Blob (Binary Large Object)
作用: 存储二进制数据的容器
创建方法:
// 从字符串创建
const blob1 = new Blob(['Hello World'], { type: 'text/plain' });
// 从ArrayBuffer创建
const buffer = new ArrayBuffer(8);
const blob2 = new Blob([buffer]);
// 合并Blob
const combined = new Blob([blob1, blob2]);
3. FileReader
核心方法:
const reader = new FileReader();
reader.onload = (e) => {
console.log(e.target.result);
};
reader.readAsText(blob); // 读取为文本
reader.readAsArrayBuffer(blob); // 读取为ArrayBuffer
reader.readAsDataURL(blob); // 读取为DataURL
4. ArrayBuffer
特性: 特性:固定长度的原始二进制缓冲区
操作方式:
const buffer = new ArrayBuffer(16);
const view = new Uint8Array(buffer);
view[0] = 255;
console.log(view); // Uint8Array [255, 0, 0, ...]
5. Base64
编码原理: 每3字节转换为4个ASCII字符
转换示例:
// 文本转Base64
btoa('Hello'); // 'SGVsbG8='
// Base64转文本
atob('SGVsbG8='); // 'Hello'
6. DataURL
格式: data:[<mediatype>][;base64],<data>
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...
转换关系大全
1. File <-> Blob
// File → Blob
const blob = file.slice(0, file.size, file.type);
// Blob → File
const file = new File([blob], 'filename', { type: blob.type });
2. Blob <-> ArrayBuffer
// Blob → ArrayBuffer
const reader = new FileReader();
reader.readAsArrayBuffer(blob);
reader.onload = () => {
const buffer = reader.result;
};
// ArrayBuffer → Blob
const newBlob = new Blob([buffer]);
3. Blob <-> DataURL
// Blob → DataURL
const reader = new FileReader();
reader.readAsDataURL(blob);
// DataURL → Blob
function dataURLtoBlob(dataurl) {
const arr = dataurl.split(','),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = newUint8Array(n);
while(n--) u8arr[n] = bstr.charCodeAt(n);
returnnew Blob([u8arr], { type: mime });
}
4. ArrayBuffer <-> Base64
// ArrayBuffer → Base64
function arrayBufferToBase64(buffer) {
let binary = '';
const bytes = newUint8Array(buffer);
for (let i = 0; i < bytes.byteLength; i++) {
binary += String.fromCharCode(bytes[i]);
}
return btoa(binary);
}
// Base64 → ArrayBuffer
function base64ToArrayBuffer(base64) {
const binaryString = atob(base64);
const len = binaryString.length;
const bytes = newUint8Array(len);
for (let i = 0; i < len; i++) {
bytes[i] = binaryString.charCodeAt(i);
}
return bytes.buffer;
}
小结
类型 | 内存占用 | 内存占用 | 适用场景 |
Blob | 低 | 快 | 文件存储/切片上传 |
ArrayBuffer | 最低 | 最快 | 二进制操作/WebSocket传输 |
DataURL | 高 | 慢 | 文件存储/切片上传 |
Object URL | 中 | 快 | 大文件预览 |
猜你喜欢
- 2025-04-27 【前端绝招】95%开发者不知道的10个神技巧!代码量直降50%!
- 2025-04-27 一起深入盘点 2025 年 React 发展的 10个趋势?
- 2025-04-27 心心念念的前端代码生成利器,前后端一网打尽
- 2025-04-27 为什么前端开发者都用Set代替Array去重?实测性能对比
- 2025-04-27 鸿蒙最终演示:前端的一些代码、服务端、数据库
- 2025-04-27 前端请求一到,后端就乱套?揭秘 Spring MVC 底层调用全流程!
- 2025-04-27 炸裂!用这 5 个黑科技,前端性能直接狂飙 200%!附全网最细代码
- 2025-04-27 掌握这几个网页前端技巧,开发效率提升
- 2025-04-27 大厂前端架构师私藏:微前端落地最全避坑指南
- 2025-04-27 前端学习保姆级教程,轻松入门 Web 开发
你 发表评论:
欢迎- 最近发表
-
- 前端流行框架Vue3教程:13. 组件传递数据_Props
- 前端必看!10 个 Vue3 救命技巧,解决你 90% 的开发难题?
- JAVA和JavaScript到底是什么关系?是亲戚吗?
- Java和js有什么区别?(java和javascript的区别和联系)
- 东方标准|Web和Java的区别,如何选择这两个专业
- 前端面试题-JS 中如何实现大对象深度对比
- 360前端一面~面试题解析(360前端笔试)
- 加班秃头别慌!1 道 Vue 面试题,快速解锁大厂 offer 通关密码
- 焦虑深夜刷题!5 道高频 React 面试题,吃透 offer 稳了
- 2025Web前端面试题大全(整理版)面试题附答案详解,最全面详细
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端md5加密 (49)
- 前端路由 (55)
- 前端数组 (65)
- 前端定时器 (47)
- 前端懒加载 (45)
- 前端接口 (46)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle查询数据库 (45)
- oracle约束 (46)
- oracle 中文 (51)
- oracle链接 (47)
- oracle的函数 (57)
- mac oracle (47)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)