node-批量上传文件

很多项目可能都会涉及到的业务是关于多文件上传的,那么需要使用到redis或者第三方库(使用redis)来实现任务队列,甚至需要控制并发量和分包(一次请求传多个文件),这样每次都会以实现功能来完成,但是不好维护,甚至很麻烦,大家可以了解一下这个包github地址

详解

目前该包自主已经支持调用者实现上传逻辑和回调,使用者只需要设置相关的参数(远程ip地址,检查接口,上传接口, 错误最大重试次数,图片上传分包大小, 检查已上传的文件分包大小,上传并发数, 是否检查校验文件),添加文件到任务队列后,就可以开始上传,内部逻辑暂时不支持使用者提供,包括任务回调。

上传逻辑

支持调用者实现:按照设置的包大小发起http请求,并执行回调,如果出错,返回(-1,this, error)参考./test中的demo

任务回调逻辑

内部:接收回调参数,如果出错,记录错误次数,并且将本次任务重新添加到任务队列队尾。如果超过最大重试次数,则结束所有任务(因使bagpipe库的原因,无法立即结束所有任务,正常情况下bagpipe会再执行一轮,因为任务被bagpipe给托管了,拿到本次任务回调的时候,其实bagpipe会直接开始下一轮的任务,有更好的优化和建议可以联系我或者评论,谢谢)
调用者: 内部回调后执行调用者传递的回调,返回的参数为err(库error), error(http error)

如果正确上传,则成功数量自增单个包文件数,全部完成则将工作状态改为false,且保持当前进度

状态维护

该包内部维护了一个任务状态,(需要注意的是该包为单实例模型,全局只有一个实例,目前是为了实现实例全局化,后期可能会支持多实例),详细请参加readme.md

依赖

"dependencies": {
    "express": "^4.17.1",          -- test
    "mkdirp": "^0.5.1",            -- test
    "multer": "^1.4.2",            -- test
    "bagpipe": "*",                -- 需要修改源码,详见readme.md
    "request": "^2.88.0",
    "request-promise": "^4.2.4"
  }

README.MD

介绍

脱离redis, 基于内存, 批量上传文件到远程服务器,按照设置大小设置每次请求的包的大小和并发数量限制

版本历史

8ab6b2e: 这是版本V 0.2.0 该本版支持调用者实现上传逻辑和接收回调

API

初始化任务队列

Upload.init({
  base_url: 'http://127.0.0.1:3008/',   // 远程目标服务器地址
  check_path: 'check_file',             // 文件校验接口
  upload_path: 'file',                  // 上传接口
});

添加任务

var file_arr = [ 'D:/files/a.test', 'D:/files/b.test' ];
Upload.createJob(file_arr);

执行任务

Upload.process(upload, callback);    //about upload and callback detail please Reference ./test demo

查询当前任务状态

const status = await Upload.status();
console.log(status);

TIPS

支持上传的文件可以在./lib/file_ext.json 中添加或修改

[
  {
    "ext": ".png",
    "contentType": "image/png"
  },
  {
    "ext": ".jpeg",
    "contentType": "image/jpeg"
  },
  {
    "ext": "jpg",
    "contentType": "image/jpeg"
  },
  {
    "ext": ".txt",
    "contentType": "text/plain"
  }
]

第三方库:bagpipe 需要修改源码./lib/bagpipe.js 148行为:method.apply(this, args);

posted @ 2019-11-04 11:20  逍遥|zi  阅读(842)  评论(0编辑  收藏  举报