0

0

JavaScript blob流式数据处理

betcha

betcha

发布时间:2025-10-28 11:41:02

|

838人浏览过

|

来源于php中文网

原创

Blob与流式处理可提升大文件性能,通过分块读取减少内存占用;利用Blob.stream()和ReadableStream实现异步逐块处理,适用于大文本解析、日志分析等场景。

javascript blob流式数据处理

在现代Web开发中,处理大文件或大量数据时,直接加载整个资源到内存中会带来性能问题。JavaScript中的Blob和流式处理机制能有效解决这类问题。通过流式读取和处理Blob数据,可以分块操作内容,减少内存占用,提升应用响应速度。

Blob与Stream的基本概念

Blob(Binary Large Object)表示不可变的二进制数据块,常用于文件上传、下载和本地数据存储。它支持分片操作,适合处理图像、视频、大文本等。

Stream

浏览器中的流主要基于 ReadableStream 接口,可通过以下方式创建:

立即学习Java免费学习笔记(深入)”;

  • 从 fetch 响应中获取流:fetch('/large-file.txt').then(res => res.body)
  • 将 Blob 转为流:new Response(blob).body
  • 手动创建可读流并通过控制器写入数据

将Blob转换为可读流并分块处理

实际开发中,常需要对用户选择的大文件进行解析而不阻塞主线程。可以通过 FileReader 配合 slice 方法实现分块读取,或更高效地使用 stream API。

示例:将 File 或 Blob 按固定大小分块读取

async function processBlobInChunks(blob, chunkSize = 1024 * 1024) {
  const fileReader = new FileReader();
  let offset = 0;

while (offset < blob.size) { const chunk = blob.slice(offset, offset + chunkSize); fileReader.readAsArrayBuffer(chunk);

// 等待当前块读取完成
await new Promise((resolve, reject) => {
  fileReader.onload = () => resolve();
  fileReader.onerror = () => reject(fileReader.error);
});

const buffer = fileReader.result;
// 处理该块数据(如发送、解析、加密等)
console.log('Processing chunk:', buffer.byteLength, 'bytes');

offset += chunkSize;

} }

这种方式虽简单,但仍是同步风格封装。更现代的做法是利用 blob.stream() 返回 ReadableStream,结合异步迭代器处理。

使用ReadableStream进行真正的流式处理

Blob 实例提供了 .stream() 方法,返回一个 ReadableStream,可配合 for-await-of 实现逐块处理。

华友协同办公自动化OA系统
华友协同办公自动化OA系统

华友协同办公管理系统(华友OA),基于微软最新的.net 2.0平台和SQL Server数据库,集成强大的Ajax技术,采用多层分布式架构,实现统一办公平台,功能强大、价格便宜,是适用于企事业单位的通用型网络协同办公系统。 系统秉承协同办公的思想,集成即时通讯、日记管理、通知管理、邮件管理、新闻、考勤管理、短信管理、个人文件柜、日程安排、工作计划、工作日清、通讯录、公文流转、论坛、在线调查、

下载

示例:流式读取并统计文本字符数

async function countCharsInBlob(blob) {
  const stream = blob.stream();
  const reader = stream.getReader();
  let totalChars = 0;
  let decoder = new TextDecoder();

try { while (true) { const { done, value } = await reader.read(); if (done) break;

  const text = decoder.decode(value, { stream: true });
  totalChars += text.length;
}
console.log('Total characters:', totalChars);

} finally { reader.releaseLock(); } }

这种模式适用于日志分析、CSV解析、大文件搜索等场景,避免一次性加载全部内容。

结合Fetch和流式响应处理远程数据

从服务器获取大型资源时,可以直接以流的形式消费响应体,无需等待完整下载。

示例:边接收边处理文本行

async function processLargeTextFile(url) {
  const res = await fetch(url);
  const reader = res.body.getReader();
  const decoder = new TextDecoder();
  let buffer = '';

while (true) { const { done, value } = await reader.read(); if (done) break;

buffer += decoder.decode(value, { stream: true });

let newline;
while ((newline = buffer.indexOf('\n')) !== -1) {
  const line = buffer.slice(0, newline);
  console.log('Line:', line);
  buffer = buffer.slice(newline + 1);
}

}

// 处理最后一行(可能无换行符) if (buffer.length > 0) { console.log('Final line:', buffer); } }

这种方法特别适合处理服务端推送的日志流、大数据导出文件等。

基本上就这些。合理使用Blob和流式API,可以让前端更高效地处理大规模数据,提升用户体验和系统稳定性。关键是理解分块思想,避免全量加载。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

780

2023.08.22

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1155

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

214

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1947

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

22

2026.01.19

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

928

2023.09.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

525

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

525

2023.08.10

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.4万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.6万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号