前言
本文结合前端大文件上传 实现GB级别文件数据的全栈式教程
需要前端Vue3+TS的文件上传方案可查看主包的主页文章,快速链接如下:
前端大文件上传方案-一站式教程(hash算法+增量+webworker多线程+并发请求池)-优快云博客
本文用到的技术栈:
- Express+ES6语法
- Sequelize ORM工具
- MySQL数据库
- multer 文件处理
实现功能:
- 文件秒传
- 断点续传
- 分片上传
- 合并文件
核心逻辑解析
-
文件秒传:后端通过文件hash值以及其他参数,判断文件是否存在于服务器,存在直接复用,不进行上传。
-
断点续传:通过文件hash值以及其他参数,判断服务器内是否存在未上传完成的切片,有则返回未上传的切片序列。
-
分片上传:使用multer中间件对文件进行存储(可使用第三方存储,如:123网盘、阿里云盘等)
-
合并文件:验证上传切片数量、大小以及完整性,对相同文件的切片进行拼接合并。
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,

最低0.47元/天 解锁文章
1686

被折叠的 条评论
为什么被折叠?



