Node后端大文件上传方案-一站式教程(express+mysql+multer)

JavaScript性能优化实战 10w+人浏览 468人参与

前言

本文结合前端大文件上传 实现GB级别文件数据的全栈式教程

需要前端Vue3+TS的文件上传方案可查看主包的主页文章,快速链接如下:

前端大文件上传方案-一站式教程(hash算法+增量+webworker多线程+并发请求池)-优快云博客

本文用到的技术栈:

  • Express+ES6语法
  • Sequelize ORM工具
  • MySQL数据库
  • multer 文件处理

实现功能:

  • 文件秒传
  • 断点续传
  • 分片上传
  • 合并文件

核心逻辑解析

  1. 文件秒传:后端通过文件hash值以及其他参数,判断文件是否存在于服务器,存在直接复用,不进行上传。

  2. 断点续传:通过文件hash值以及其他参数,判断服务器内是否存在未上传完成的切片,有则返回未上传的切片序列。

  3. 分片上传:使用multer中间件对文件进行存储(可使用第三方存储,如:123网盘、阿里云盘等)

  4. 合并文件:验证上传切片数量、大小以及完整性,对相同文件的切片进行拼接合并。

1. 数据库准备

需使用到两个数据库对文件上传进度以及文件地址进行存储。

  • files表:完整文件表,用于存储已上传的文件的路径以及对应的参数。
  • chunks表:临时文件/切片表,用于存储文件切片。

基础表格结构(可根据项目需求添加字段):

  • files表:主键、hash值标识、文件名称、文件大小、文件路径
  • chunks表:主键、hash值标识、分片序号、分片临时存储路径

表格索引:

  • chunks索引:  联合索引:hash值标识+分片序号  普通索引:hash值标识 

可对数据库内容自行创建,上述数据库字段为最基础的、最低要求的字段。可根据项目需求对数据库进行二次优化。

Sequelize迁移文件展示

files表
//create-files.cjs

'use strict'
/** @type {import('sequelize-cli').Migration} */
module.exports= {
  async up(queryInterface, Sequelize) {
    await queryInterface.createTable('Files', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER.UNSIGNED,
      },
      fileHash: {
        type: Sequelize.STRING(64),
        unique: true,
        allowNull: false,
        comment: '文件hash标识',
      },
      fileName: {
        type: Sequelize.STRING(255),
        allowNull: false,
        comment: '文件名称',
      },
      fileSize: {
        type: Sequelize.BIGINT.UNSIGNED,
        allowNull: false,
        comment: '文件大小',
      },
      filePath: {
        type: Sequelize.STRING(512),
        allowNull: false,
        comment: '文件路径',
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE,
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE,
      },
    })
  },
  async down(queryInterface, Sequelize) {
    await queryInterface.dropTable('Files')
  },
}
chunks表
//create-chunks.cjs

'use strict'
/** @type {import('sequelize-cli').Migration} */
module.exports= {
  async up(queryInterface, Sequelize) {
    await queryInterface.createTable('Chunks', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER.UNSIGNED,
      },
      fileHash: {
        type: Sequelize.STRING(64),
        allowNull: false, // 分片必须属于某个文件,不可为空
        comment: '关联的文件唯一哈希(对应Files表的fileHash)',
      },
      chunkIndex: {
        type: Sequelize.INTEGER.UNSIGNED,
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值