From e448704dc7f350ec9ac041dc0a534b0a1cf6300b Mon Sep 17 00:00:00 2001 From: luying Date: Thu, 24 Sep 2020 20:09:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0json=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gm-server/app/controller/upload.ts | 103 +++++++++++++++++++++++++---- gm-server/app/router.ts | 1 + shared/db/BattleRecord.ts | 4 ++ 3 files changed, 94 insertions(+), 14 deletions(-) diff --git a/gm-server/app/controller/upload.ts b/gm-server/app/controller/upload.ts index 9acb694c0..987b863c6 100644 --- a/gm-server/app/controller/upload.ts +++ b/gm-server/app/controller/upload.ts @@ -1,7 +1,7 @@ import { Controller } from 'egg'; +import { Stream } from 'stream'; const fs = require('fs'); const unzip = require("unzip-stream"); -const awaitWriteStream = require('await-stream-ready').write; const temp = require('temp'); const compressing = require("compressing"); const moment = require("moment"); @@ -28,17 +28,27 @@ export default class UploadController extends Controller { fs.rmdirSync(path); } } - private async readFileDir (dirPath) { - return new Promise((resolve:any, reject: any) => { - fs.readdir(dirPath, (err, files) => { - if(err) { - reject(err); - } else { - resolve(files); - } - }); + + + private getFileList (p: string, resultArr: Array<{path:string,name:string}>) { + console.log(p, fs.existsSync(p)) + if( fs.existsSync(p) ) { + let files = fs.readdirSync(p); + console.log(p, files, resultArr); + files.forEach((file) =>{ + let curPath = p + "/" + file; + // console.log(curPath, fs.statSync(curPath).isDirectory()) + if(fs.statSync(curPath).isDirectory()) { + this.getFileList(curPath, resultArr); + } else { + resultArr.push({ + path: curPath, + name: file + }); + } }); } + } public async upload() { const { ctx } = this; @@ -53,11 +63,10 @@ export default class UploadController extends Controller { let dirPath = await temp.mkdir(folderName); // 临时文件夹 // 解压上传文件的stream - var unzipExtractor = unzip.Extract({ path: dirPath }); - await awaitWriteStream(stream.pipe(unzipExtractor)); // 异步写入文件 + await this.doUnzipExtra(stream, dirPath); console.log('读取文件'); - let files:any = await this.readFileDir(dirPath); + let files:any = fs.readdirSync(dirPath); let msg = '', result = ''; for(let file of files) { let flag = false; @@ -87,7 +96,7 @@ export default class UploadController extends Controller { console.log('历史记录压缩移动'); let isEmpty = true; try { - let oldFiles:any = await this.readFileDir(hotUpdateAddr); + let oldFiles:any = fs.readdirSync(hotUpdateAddr); console.log(oldFiles.length); isEmpty = oldFiles.length <= 0; } catch(e) { @@ -137,4 +146,70 @@ export default class UploadController extends Controller { } } + private async doUnzipExtra(stream: Stream, dirPath: string) { + return new Promise((resolve, reject) => { + // 解压上传文件的stream + var unzipExtractor = unzip.Extract({ path: dirPath }); + unzipExtractor.on('close', function() { + resolve(); + }); + + unzipExtractor.on('close', function(e) { + reject(e); + }); + + stream.pipe(unzipExtractor); // 异步写入文件 + }) + } + + private jsonFolderName = 'resource'; + private jsonFolderPath = `/root/zyz/shared/${this.jsonFolderName}`; + + public async uploadJson() { + const { ctx } = this; + const stream = await ctx.getFileStream(); + // const filename = stream.filename; + // const target = path.join(url, filename); + + if(stream.mimeType == 'application/zip') { + try { + let dirPath = await temp.mkdir(this.jsonFolderName); // 临时文件夹 + + console.log('读取文件'); + await this.doUnzipExtra(stream, dirPath); + let files = new Array<{path:string,name:string}>(); + this.getFileList(dirPath, files); + console.log(files); + + console.log('保存文件'); + if (!fs.existsSync(this.jsonFolderPath)) { + fs.mkdirSync(this.jsonFolderPath); + } + for (let {path, name} of files) { + console.log(`${this.jsonFolderPath}/${name}`); + fs.renameSync(path, `${this.jsonFolderPath}/${name}`); + } + + temp.cleanupSync(); + return ctx.body = { + "status": "ok", + "data": "上传成功", + "files": JSON.stringify(files) + } + } catch (err) { + console.log(err) + return ctx.body = { + "status": "error", + "data": err.message + } + } + + } else { + return ctx.body = { + "status": "error", + "data": "格式错误" + } + } + } + } diff --git a/gm-server/app/router.ts b/gm-server/app/router.ts index 4bada6592..2860f9c9e 100644 --- a/gm-server/app/router.ts +++ b/gm-server/app/router.ts @@ -10,6 +10,7 @@ export default (app: Application) => { router.post('/api/get_route', controller.login.getMenu); router.get('/api/currentUser', tokenParser, controller.login.currentUser); router.post('/api/upload/hotupdate', tokenParser, controller.upload.upload); + router.post('/api/upload/uploadjson', tokenParser, controller.upload.uploadJson); router.post('/api/gmaccount/getgmlist', tokenParser, controller.gmaccount.getGmList); router.post('/api/gmaccount/createaccount',tokenParser, controller.gmaccount.createGmAccount); diff --git a/shared/db/BattleRecord.ts b/shared/db/BattleRecord.ts index caf01bd7b..9a84e5c11 100644 --- a/shared/db/BattleRecord.ts +++ b/shared/db/BattleRecord.ts @@ -18,6 +18,10 @@ export default class BattleRecord extends BaseModel { @prop({ required: true }) battleId: number; // 关卡 id @prop({ required: true }) + warName: string; // 关卡 名 + @prop({ required: true }) + warType: number; // 关卡 类型 + @prop({ required: true }) status: number; // 关卡状态 0-挑战中 1-挑战成功 2-挑战失败 @prop({ required: true }) record: { // 使用的武将等记录