const path = require('path');
const fse = require('fs-extra');// fs的扩展包
// 合并文件
const UPLOAD_DIR = path.resolve(__dirname,'target');
// 需要合成的文件名称
const filename = 'yb'
// 合成后的路径文件路径
const filePath = path.resolve(__dirname,'img',`${filename}.jpeg`);
/**
* 先读取出来然后写入文件
* @param {path} 写入路径
* @param {writeStream} 写入流
* @returns Promise
*/
const pipeStream = (path ,writeStream) =>
new Promise(resolve => {
// 想读出来 后写入
const readStream = fse.createReadStream(path);
// 结束之后就返回成功
readStream.on('end',()=>{
// 成功后就删除文件 逐个删除
fse.unlinkSync(path)
resolve()
})
readStream.pipe(writeStream)
})
//
const mergeFileChunk = async (filePath,filename,size) =>{
// 文件地址
const chunkDir = path.resolve(UPLOAD_DIR,filename);
// 读取目录下所有文件 返回一个数组类型
const chunkPaths = await fse.readdir(chunkDir)
// 因为获取的文件可能是无须的,所以需要排序
chunkPaths.sort((a,b)=> a.split('-')[1] - b.split('-')[1])
// 并发
await Promise.all(
// 编程一个Promise的写入数组
chunkPaths.map((chunkPath,index)=>{
// 返回一个promise
// 传入 1、每一块地址 2、创建写入流
pipeStream(
path.resolve(chunkDir,chunkPath),
// 写入文件名称 写文件大小(从哪个先开始)
fse.createWriteStream(filePath,{
start:index * size,
end:(index + 1) * size
})
)
})
)
// 成功后删除文件目录
fse.rmdirSync(chunkDirs)
}
mergeFileChunk(filePath,filename,0.5 * 1024 * 1024)