1. const path = require('path');
    2. const fse = require('fs-extra');// fs的扩展包
    3. // 合并文件
    4. const UPLOAD_DIR = path.resolve(__dirname,'target');
    5. // 需要合成的文件名称
    6. const filename = 'yb'
    7. // 合成后的路径文件路径
    8. const filePath = path.resolve(__dirname,'img',`${filename}.jpeg`);
    9. /**
    10. * 先读取出来然后写入文件
    11. * @param {path} 写入路径
    12. * @param {writeStream} 写入流
    13. * @returns Promise
    14. */
    15. const pipeStream = (path ,writeStream) =>
    16. new Promise(resolve => {
    17. // 想读出来 后写入
    18. const readStream = fse.createReadStream(path);
    19. // 结束之后就返回成功
    20. readStream.on('end',()=>{
    21. // 成功后就删除文件 逐个删除
    22. fse.unlinkSync(path)
    23. resolve()
    24. })
    25. readStream.pipe(writeStream)
    26. })
    27. //
    28. const mergeFileChunk = async (filePath,filename,size) =>{
    29. // 文件地址
    30. const chunkDir = path.resolve(UPLOAD_DIR,filename);
    31. // 读取目录下所有文件 返回一个数组类型
    32. const chunkPaths = await fse.readdir(chunkDir)
    33. // 因为获取的文件可能是无须的,所以需要排序
    34. chunkPaths.sort((a,b)=> a.split('-')[1] - b.split('-')[1])
    35. // 并发
    36. await Promise.all(
    37. // 编程一个Promise的写入数组
    38. chunkPaths.map((chunkPath,index)=>{
    39. // 返回一个promise
    40. // 传入 1、每一块地址 2、创建写入流
    41. pipeStream(
    42. path.resolve(chunkDir,chunkPath),
    43. // 写入文件名称 写文件大小(从哪个先开始)
    44. fse.createWriteStream(filePath,{
    45. start:index * size,
    46. end:(index + 1) * size
    47. })
    48. )
    49. })
    50. )
    51. // 成功后删除文件目录
    52. fse.rmdirSync(chunkDirs)
    53. }
    54. mergeFileChunk(filePath,filename,0.5 * 1024 * 1024)