如何用Node.js实现一个支持断点续传的文件上传?

实现断点续传需前后端协同:前端切片并记录上传状态,后端存储分片并支持查询与合并;通过文件哈希标识唯一性,上传前检查已传分片以跳过重传,最后按序合并并清理临时文件。

如何用node.js实现一个支持断点续传的文件上传?

实现支持断点续传的文件上传,核心在于将大文件分片上传,并记录已上传的片段信息,以便在网络中断或上传失败后能从中断处继续上传。Node.js结合前端可以很好地实现这一功能。以下是完整的实现思路和步骤。

1. 前端:文件切片与分片上传

用户选择文件后,前端将其切分为多个小块(chunk),并逐个上传。每个分片携带唯一标识(如文件名、文件哈希、分片序号等)。

示例代码(前端):

计算文件哈希(可选,用于唯一标识文件): 可使用 spark-md5 或 FileReader 读取文件部分内容生成哈希。

切片上传逻辑:

读取文件,使用 File.slice() 方法切割成固定大小的块(如 1MB) 每块通过 POST 请求发送到服务器,附带参数:文件名、分片索引、总分片数、文件哈希等 上传前可先请求服务器查询已上传的分片,跳过已上传的部分 所有分片上传完成后,发送合并请求

2. 后端(Node.js):接收分片并存储

使用 Express 搭建服务,处理分片上传、状态查询和文件合并。

所需依赖:

express、multer(处理 multipart/form-data)、fs、path

关键接口设计:/upload/check:查询某文件已上传的分片列表 /upload/chunk:接收单个分片,保存到临时目录 /upload/merge:所有分片上传完成后,合并文件

示例代码(Node.js 后端):

const express = require('express');const multer = require('multer');const fs = require('fs');const path = require('path');const app = express();const uploadDir = './uploads';const chunkDir = './chunks';!fs.existsSync(uploadDir) && fs.mkdirSync(uploadDir);!fs.existsSync(chunkDir) && fs.mkdirSync(chunkDir);// 配置 multer 存储分片const storage = multer.diskStorage({  destination: (req, file, cb) => {    const dir = path.join(chunkDir, req.body.fileHash);    !fs.existsSync(dir) && fs.mkdirSync(dir, { recursive: true });    cb(null, dir);  },  filename: (req, file, cb) => {    // 使用分片索引命名    cb(null, `part-${req.body.chunkIndex}`);  }});const upload = multer({ storage });// 查询已上传的分片app.post('/upload/check', (req, res) => {  const { fileHash } = req.body;  const chunkPath = path.join(chunkDir, fileHash);  if (!fs.existsSync(chunkPath)) return res.json({ uploaded: [] });  fs.readdir(chunkPath, (err, files) => {    if (err) return res.status(500).send();    const uploaded = files.map(f => parseInt(f.split('-')[1]));    res.json({ uploaded });  });});// 接收分片app.post('/upload/chunk', upload.single('chunk'), (req, res) => {  res.json({ success: true });});// 合并文件app.post('/upload/merge', (req, res) => {  const { fileHash, fileName, totalChunks } = req.body;  const chunkPath = path.join(chunkDir, fileHash);  const filePath = path.join(uploadDir, fileName);  const writeStream = fs.createWriteStream(filePath);  function appendChunk(i) {    if (i >= totalChunks) {      writeStream.end();      // 清理分片      fs.rm(chunkPath, { recursive: true }, () => {});      return res.json({ url: `/files/${fileName}` });    }    const partPath = path.join(chunkPath, `part-${i}`);    const readStream = fs.createReadStream(partPath);    readStream.pipe(writeStream, { end: false });    readStream.on('end', () => appendChunk(i + 1));  }  appendChunk(0);});

3. 断点续传的关键逻辑

要真正实现“续传”,需满足以下几点:

唯一标识文件:使用文件名 + 大小 + 哈希值确保文件唯一性 上传前检查:上传开始前调用 /upload/check 获取已上传的分片,跳过重传 按序存储分片:每个分片以索引命名,便于后续合并 合并后清理临时文件:防止磁盘占用

4. 前端优化建议

使用 Web Workers 计算大文件哈希,避免阻塞 UI 添加上传进度条:基于已上传分片数量 / 总数 支持暂停/恢复:暂停时停止发送,恢复时重新 check 并继续 错误重试机制:对失败的分片进行有限次重试基本上就这些。核心是前后端协同管理分片状态,Node.js 负责接收、存储和合并,前端负责切片和流程控制。不复杂但容易忽略细节,比如文件哈希一致性、并发写入等问题。

以上就是如何用Node.js实现一个支持断点续传的文件上传?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1528455.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月20日 20:17:20
下一篇 2025年12月20日 20:17:37

相关推荐

  • HTML 与 CSS 联动全解析

    html 和 css 联动可创建交互式且用户友好的 web 页面,通过使用 html 定义页面结构,再用 css 样式化、布局。联动步骤如下:使用 标签将 css 链接到 html 文档。使用选择器在 css 中选择特定的 html 元素。应用样式属性来设置文本、颜色、边框等。 HTML 与 CSS…

    2025年12月22日
    000
  • 前端面试官常问的问题:如何优化网页加载速度?

    优化网页加载速度一直是前端开发中至关重要的一环。在面试中,面试官常常会问到关于网页加载速度优化的问题,因为这不仅考察了面试者对前端性能优化的理解程度,还能体现出其解决问题的能力和实践经验。以下是关于如何优化网页加载速度的一些常见方法和技巧,供大家参考。 一、减少 HTTP 请求 合并文件:将多个 C…

    2025年12月22日
    000
  • 前端面试官常问的问题:如何实现前端路由?

    前端面试官常问的问题:如何实现前端路由? 前端开发是近年来蓬勃发展的领域,技术的不断更新也让前端开发人员面临着更多的挑战与机遇。在前端开发面试中,前端路由是一个经常被问及的话题之一。实现前端路由是前端开发中的一项基础工作,掌握前端路由的原理和实现方式对于提升开发效率和用户体验至关重要。 一、什么是前…

    2025年12月22日
    000
  • 不同维度看前端与后端开发

    前端与后端开发是现代软件开发领域中两个重要的方向,它们各自担负着不同的职责和任务,在项目中密切合作,共同构建出一个完整的应用程序。然而,从不同的维度来看前端和后端开发,会呈现出不同的特点和挑战。本文将从技术层面、团队协作以及职业发展等方面,探讨前端与后端开发之间的异同处。 首先,从技术层面来看,前端…

    2025年12月22日
    000
  • 前端工程师职责解析:主要做什么工作?

    前端工程师职责解析:主要做什么工作? 随着互联网的快速发展,前端工程师作为一个非常重要的职业角色,扮演着连接用户与网站应用程序的桥梁,起着至关重要的作用。那么,前端工程师主要做些什么工作呢?本文将对前端工程师的职责进行解析,让我们来一探究竟。 一、前端工程师的基本职责 网站开发与维护:前端工程师负责…

    2025年12月22日
    000
  • 前端与后端的差异:你了解吗?

    前端与后端的差异:你了解吗? 在当今数字化时代,互联网技术已经深刻地改变了我们的生活方式和工作方式。作为互联网技术的两个重要组成部分,前端和后端在网站和应用程序的开发中扮演着至关重要的角色。但是,很多人对于前端和后端之间的差异并不是很清楚。本文将深入探讨前端与后端的区别,帮助读者更好地了解它们之间的…

    2025年12月22日
    000
  • 探秘前端工程师的日常工作内容

    探秘前端工程师的日常工作内容 随着互联网的快速发展,前端工程师这个职业逐渐走进大众视野。他们承担着网站和应用程序界面开发、优化以及用户体验改进等重要任务,是连接用户与互联网技术的桥梁。那么,究竟前端工程师的日常工作内容是什么呢?让我们一起来探秘。 与设计团队合作前端工程师的工作通常从与设计团队的沟通…

    2025年12月22日
    000
  • 深入了解前端和后端的区别

    前端和后端是软件开发中两个非常重要的概念,它们分别负责不同的功能和任务。在互联网时代,前端和后端的区分已经变得十分明显,而深入了解它们之间的区别对于想要从事软件开发的人来说是非常重要的。 前端,顾名思义就是软件的前端部分,也称为客户端。它是与用户直接交互的界面,包括网页的布局、设计、交互操作、内容展…

    2025年12月22日
    000
  • 什么是前端模块化ESM?

    前端ESM是什么,需要具体代码示例 在前端开发中,ESM是指ECMAScript Modules,即基于ECMAScript规范的模块化开发方式。ESM带来了许多好处,比如更好的代码组织、模块间的隔离和可重用性等。本文将介绍ESM的基本概念和用法,并提供一些具体的代码示例。 ESM的基本概念在ESM…

    2025年12月22日
    000
  • 前端输出设置

    前端output配置,需要具体代码示例 前端开发中,output配置是一项非常重要的配置。它用于定义项目打包后生成的文件路径、文件名以及相关的资源路径等。本文将介绍前端output配置的作用、常用配置选项,并给出具体的代码示例。 output配置的作用:output配置项用于指定项目打包后生成的文件…

    2025年12月22日
    000
  • 深入解析前端网站性能优化模式:提升用户体验流畅度

    在当今互联网发展日新月异的时代,前端网站的性能优化越来越受到重视。随着移动互联网的普及和网站内容的增加,用户对网站性能的要求也越来越高。因此,对于前端开发人员而言,学习和应用网站性能优化模式是至关重要的。 一、加载速度优化 压缩文件:将网站的HTML、CSS和JavaScript文件进行压缩,减少其…

    2025年12月22日
    000
  • 构建一个出色的网站性能优化策略的方法解析

    如何设计一个高效的网站性能优化方案 随着互联网的高速发展,网站已经成为了人们获取信息、进行交流和购物的重要平台。然而,由于网站的访问量和复杂度不断增加,网站性能也成为了一个日益重要的问题。一个高效的网站性能可以提升用户体验、提高转化率,并且有助于网站的搜索引擎优化。本文将介绍如何设计一个高效的网站性…

    2025年12月22日
    000
  • 推荐有效的工具和技术来进行网站性能优化

    随着互联网的快速发展,越来越多的企业将自己的业务扩展到了网上。然而,随之而来的问题是网站的性能优化。一个高效的网站能够提高用户体验,增加访问量以及销售额。为了达到这些目标,下面将要介绍一些有效的工具和技术来帮助您对网站进行性能优化。 页面压缩:页面压缩是通过减少文件大小来提高页面加载速度的一种方法。…

    2025年12月22日
    000
  • 提高网站性能的前端优化模式使用指南

    如何利用前端优化模式提升网站性能? 随着互联网的快速发展,网站已经成为人们获取信息、进行交流和娱乐的重要渠道。然而,随着网站内容和功能的不断增加,许多网站开始面临性能问题,比如页面加载缓慢、响应时间延长等。为了提高用户的体验和满意度,网站的性能优化显得尤为重要。而前端优化模式正是一种有效的方法来提升…

    2025年12月21日
    000
  • 提升网站性能的重要性与方法论

    网站性能优化的必要性与方法论 随着互联网的发展,网站已成为人们获取信息和进行各类在线交流的主要途径之一。然而,很多网站在面对高访问量和复杂的业务场景时表现不佳,导致用户体验差、页面加载缓慢等问题,影响了用户对网站的满意度和忠诚度。因此,对于网站来说,性能优化是一项必要且关键的工作。 首先,让我们一起…

    2025年12月21日
    000
  • 揭秘前端优化绝招:让网站飞快加载!

    前端优化大揭秘:让网站速度飞起来! 在如今的互联网时代,网站已经成为人们获取信息和进行交流的重要渠道。然而,随着互联网的普及和发展,用户对网站速度的要求也越来越高。一旦网站加载过慢,用户很可能选择离开,甚至转向竞争对手的网站。因此,网站的速度优化变得至关重要。本文将揭秘前端优化的技巧和方法,帮助你让…

    2025年12月21日
    000
  • 实施高效的网站性能优化策略

    随着互联网的迅速发展,网站成为了企业宣传、营销、销售的重要渠道。然而,不少网站在面对高访问量和用户同时访问的情况下,性能下降严重,导致用户体验差,甚至影响到网站的商业价值。为了解决这个问题,网站性能优化成为了重要的工作。本文将从策略和实施方法两个方面,介绍网站性能优化的一些经验。 一、策略: 性能测…

    2025年12月21日
    000
  • 优化网站性能的实战经验分享:从前端到后端的全面应用

    从前端到后端:全面优化网站性能的实战经验分享 近年来,随着互联网的快速发展,网站的性能优化变得越来越重要。用户对网站的访问速度和响应时间要求越来越高,优化网站性能已经成为每个开发者都应该关注的重要任务。本文将分享一些实战经验,帮助开发者全面优化网站性能,从前端到后端,让用户体验更加顺畅。 首先,从前…

    2025年12月21日
    000
  • 提高网站性能和速度的优化方法

    如何通过优化提升网站的性能和速度 随着互联网的快速发展,网站已经成为了企业宣传、产品销售和信息交流的重要渠道。然而,由于用户的期望越来越高,网站性能和速度成为了用户体验的重要指标。一个拥有良好性能和快速加载速度的网站能够提高用户满意度、增加转化率和提升搜索引擎排名。下面我们将详细探讨如何通过优化来提…

    2025年12月21日
    000
  • 网站性能优化:前端关键步骤来增加效能

    在当今互联网高速发展的时代,网站已成为连接企业与用户的重要窗口。然而,随着网站规模的不断扩大和功能的日益复杂,网站性能问题也日益突出。用户对网站的体验质量要求越来越高,因此,优化网站性能成为了每个前端开发人员都应该关注的重要问题。 优化网站性能可以提升网站加载速度和响应速度,提升用户体验,增加页面访…

    2025年12月21日
    000

发表回复

登录后才能评论
关注微信