diff --git a/app.js b/app.js index b810071..8a666bc 100644 --- a/app.js +++ b/app.js @@ -1,68 +1,18 @@ import Koa from 'koa' -import parse from 'co-busboy' import logger from 'koa-logger' import path from 'path' import fs from 'fs' +import router from 'koa-route' + +import upload from './upload' +import md5 from './md5' const app = new Koa() -const outputDir = path.join(__dirname, 'receive'); app.use(logger()); -app.use(function* (next) { - // ignore non-POSTs - if ('POST' != this.method) return yield next; - - // multipart upload - var parts = parse(this); - var part; - - while ((part = yield parts)) { - if (part.constructor.name === 'FileStream') { - let filename = part.filename; - let chunkIndex, prefix; - - if (filename.indexOf('_IDSPLIT_') > 0) { - prefix = filename.split('_IDSPLIT_')[0]; - chunkIndex = filename.split('_IDSPLIT_')[1]; - - // // // 错误处理测试使用 - if (chunkIndex == 1) { - // console.log(`set failed of ${chunkIndex}`); - // this.status = 500; - } - } - else { - prefix = filename; - chunkIndex = '0'; - } - - let fileDir = path.join(outputDir, prefix) - - if (!fs.existsSync(fileDir)) { - fs.mkdirSync(fileDir); - } - - var stream = fs.createWriteStream(path.join(fileDir, chunkIndex)); - part.pipe(stream); - console.log('uploading %s -> %s', part.filename, stream.path); - } - else { - let param = part[0]; - let value = part[1]; - console.log(`${param} : ${value}`); - } - } - - this.body = { - error: 0, - errmsg: 'ok' - } -}); - -// response -app.use(async (ctx) => { - ctx.body = ` +app.use(router.get('/', function* () { + this.body = ` @@ -74,7 +24,9 @@ app.use(async (ctx) => { ` -}) +})); +app.use(router.post('/upload', upload)); +app.use(router.post('/md5', md5)); app.listen(3000, () => console.log('server started 3000')) diff --git a/md5.js b/md5.js new file mode 100644 index 0000000..c262e92 --- /dev/null +++ b/md5.js @@ -0,0 +1,39 @@ +import fs from 'fs' +import parse from 'co-body' +import path from 'path' +import crypto from 'crypto' + +const receiveRootDir = path.join(__dirname, 'receive'); + +function toMd5(buffer) { + let md5 = crypto.createHash('md5'); + md5.update(buffer); + return md5.digest('hex'); +} + +module.exports = function* () { + var body = yield parse(this, { + limit: '1kb' + }); + + let filename = body.filename; + let fileDir = path.join(receiveRootDir, filename); + + let totalBuffer = Buffer.alloc(0); + let dirInfo = fs.readdirSync(fileDir); + + dirInfo = dirInfo.sort(function(pre, next) { + return pre - next; + }); + + dirInfo.forEach(name => { + let chunkPath = path.join(fileDir, name); + let buffer = fs.readFileSync(chunkPath); + totalBuffer = Buffer.concat([totalBuffer, buffer], totalBuffer.length + buffer.length); + }) + + this.body = { + error: 0, + data: toMd5(totalBuffer) + } +} \ No newline at end of file diff --git a/package.json b/package.json index 018ee7a..1d27762 100644 --- a/package.json +++ b/package.json @@ -24,9 +24,11 @@ }, "homepage": "https://github.com/geekplux/koa2-boilerplate#readme", "dependencies": { + "co-body": "^4.2.0", "co-busboy": "^1.3.1", "koa": "^2.0.0-alpha.3", - "koa-logger": "^1.3.1" + "koa-logger": "^1.3.1", + "koa-route": "^2.4.2" }, "devDependencies": { "babel-plugin-syntax-async-functions": "^6.8.0", diff --git a/upload.js b/upload.js new file mode 100644 index 0000000..8d031a8 --- /dev/null +++ b/upload.js @@ -0,0 +1,56 @@ +import parse from 'co-busboy' +import path from 'path' +import fs from 'fs' + +const outputDir = path.join(__dirname, 'receive'); + +module.exports = function* () { + // ignore non-POSTs + if ('POST' != this.method) return yield next; + + // multipart upload + var parts = parse(this); + var part; + + while ((part = yield parts)) { + if (part.constructor.name === 'FileStream') { + let filename = part.filename; + let chunkIndex, prefix; + + if (filename.indexOf('_IDSPLIT_') > 0) { + prefix = filename.split('_IDSPLIT_')[0]; + chunkIndex = filename.split('_IDSPLIT_')[1]; + + // // // 错误处理测试使用 + if (chunkIndex == 1) { + // console.log(`set failed of ${chunkIndex}`); + // this.status = 500; + } + } + else { + prefix = filename; + chunkIndex = '0'; + } + + let fileDir = path.join(outputDir, prefix) + + if (!fs.existsSync(fileDir)) { + fs.mkdirSync(fileDir); + } + + var stream = fs.createWriteStream(path.join(fileDir, chunkIndex)); + part.pipe(stream); + console.log('uploading %s -> %s', part.filename, stream.path); + } + else { + let param = part[0]; + let value = part[1]; + console.log(`${param} : ${value}`); + } + } + + this.body = { + error: 0, + errmsg: 'ok' + } +} \ No newline at end of file