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