javascript中文件的切片与合并

星期一, 1月 8, 2024 | 1分钟阅读 | 更新于 星期一, 1月 8, 2024

@
javascript中文件的切片与合并

文件切片在前端大文件上传时有很好的应用效果,可以将文件控制在更小的粒度,毕竟操作大文件困难,而操作小粒度的文件更简单高效。文本介绍前端和Nodejs中文件的切片与合并操作。

前端中对文件切片、合并

先说切片,切片主要用到Blob接口的slice()方法。

//用户通过<input type=file/> 选择文件后拿到到filelists
const file = filelists[0];
const partSize = 1024*1024;//每片2MB大小
const finalSegments = [];//切好的片按照顺序放到这里。

for(let i =0;i<file.size;i+=partSize){
    //此处的i+partSize超出文件的size不会报错而是当成文件的size值。
    finalSegments.push(file.slice(i,i+partSize));
}

切完片剩下的就是将小文件一个个的上传到后端即可,上传时也要把切片的序号一并带过去,方便后端在全部上传好后按照顺序组装合并成一个。

再来说前端如何将几个切好的小文件合并成一个完整文件。

const file_segments = [];
Promise.all([
    fetch('/file1').then(res => res.blob()),
    fetch('/file2').then(res => res.blob()),
    fetch('/file3').then(res => res.blob()),
]).then(blobs => {
    const new_file = new File(blobs,'file.pdf');
})

如果涉及到下载,可以加上以下代码:

const a = document.createElement('a')
a.download = new_file.name;
a.href = URL.createObjectURL(newFile);
a.click();

Nodejs中对文件的切片与合并

nodejs中处理文件就相对简单多了,只用到了buffersubarrayBuffer.concat方法。

const fs = require('fs')
const buffer = fs.readFileSync('file.pdf')
//切割
const part1 = buffer.subarray(0,1024*1024);//1MB
const part2 = buffer.subarray(1024*1024,2*1024*1024);//2MB
//保存文件切片
fs.writeFileSync('./part1',part1);
fs.writeFileSync('./part2',part2);

//合并文件切片
const mergedFileBuffer = Buffer.concat([part1,part2]);
//保存到文件磁盘
fs.writeFileSync("./merged-file.pdf",mergedFileBuffer);

再说断点续传

断点续传本质就是先处理文件的切片,等到所有切片处理完之后再由程序进行合并。

我认为,断点续传可以用在上传中也可以用在下载的过程中,因为有了文件切片, 可以将尚未上传或下载的blob切片数据做存储(web端已经可以借助indexDB缓存blob数据了),同时计算上传或下载进度,下次重启设备时继续上传或下载,当所有切片处理完毕,再合并提示用户成功。

但是web应用不比原生应用,其存储空间有限,如果文件太大会导致缓存失败,这是web端受限的地方。

© 2016 - 2025 Jebben 开发日志&网络随笔

🌱 Powered by Hugo with theme Dream.

关于博主

自我介绍

大家好,我是 Jabin,一名拥有 8 年工作经验的前端工程师。我是一个自学成才的开发者,通过不断学习和实践,积累了丰富的 web 端开发经验以及在 B 端后台管理、监控和 C 端教育、媒体类项目方面的丰富经验。

关于我的技能

我精通多种前端技术,包括但不限于:

  • JavaScript 和 TypeScript:我熟练掌握 JavaScript 和 TypeScript,能够利用它们构建出色的前端应用程序。
  • CSS:我对 CSS 有深入的理解,能够编写出美观、响应式的样式。
  • 前端框架:我熟练使用 Angular、React、Vue 和 Next.js 等前端框架,能够根据项目需求灵活选择并应用合适的技术栈。
  • 前端工具:我熟悉 webpack、Vite 等常用的前端打包工具,以及框架配套的 CLI 工具,能够高效地进行项目开发和部署。
  • 后端技术:我了解服务端语言 Java 和 Node.js,并能够与后端开发人员紧密合作,实现完整的应用程序。
  • 数据库和操作系统:我熟悉 SQL 数据库和 Linux 操作系统的常见操作和命令,能够进行数据库管理和服务器配置。

我的项目经验

我曾主导多个从零到一的项目,参与过数百万 UV 项目的开发,具有丰富的项目开发与团队合作经验。

我对技术充满热情,喜欢钻研新技术和解决复杂的技术问题。我还积极参与开源社区,贡献自己的力量,与各地的开发者共同探索和分享技术前沿。

结语

我是一个对技术认真负责、可靠可靠的人,热爱挑战和创新。我希望通过我的个人网站,与更多志同道合的人分享我的经验和见解,共同推动前端技术的发展和进步。

欢迎来到我的个人网站,期待与您的交流和合作!