var upload = function (stream) { var relativePath = path.relative(options.srcDirname, file); var destExtname = path.extname(file); var sign = qiniu.signature(relativePath); var fd = new FormData(); fd.append('key', sign.key); fd.append('token', sign.token); fd.append('file', stream, { contentType: mime.get(destExtname) }); request.post({ url: uploadURL, form: fd, timeout: -1 }, function (err, body, res) { if (err) { err.file = file; return callback(err, body); } if (res.statusCode === 200) { return callback(null, body); } var json; try { json = JSON.parse(body); } catch (err) { json = { error: 'parse upload response error' } } err = new Error(json.error); err.file = file; callback(err); }); };
module.exports = function (options) { banner(); // 1. parse config var configs = parseConfig({ srcDirname: options.srcDirname }); qiniu.config({ accessKey: configs.accessKey, secretKey: configs.secretKey, bucket: configs.bucket, dirname: configs.destDirname, mimeLimit: '*' }); // 2. parse cache var matchCache = parseCache.get(configs.uploadFiles, { srcDirname: options.srcDirname }); var willUploadFiles = []; dato.each(configs.uploadFiles, function (index, file) { if (!matchCache[index]) { willUploadFiles.push(file); } }); // 3. upload queue var willUploadLength = willUploadFiles.length; var willUploadGroup = []; while (willUploadFiles.length) { willUploadGroup.push(willUploadFiles.splice(0, configs.parallel)); } var startTime = Date.now(); var progress; howdo .each(willUploadGroup, function (i, group, next) { howdo .each(group, function (j, file, done) { upload(file, configs, function (err) { if (err) { return done(err); } if(!progress){ progress = new Progress('[:bar] :current/' + willUploadLength + ' 剩余::etas', { complete: '=', incomplete: ' ', width: 70, total: willUploadLength }); } parseCache.set(file, { srcDirname: options.srcDirname }); progress.tick(1); done(); }); }) .together(next); }) .follow() .try(function () { console.log(); debug.success('upload files', willUploadLength); debug.success('upload success', 'past ' + (Date.now() - startTime) + 'ms'); }) .catch(function (err) { console.log(); debug.error('upload file', err.file); debug.error('upload error', err.message); }); };