添加json上传功能

This commit is contained in:
luying
2020-09-24 20:09:51 +08:00
parent 5392f0b861
commit e448704dc7
3 changed files with 94 additions and 14 deletions

View File

@@ -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": "格式错误"
}
}
}
}

View File

@@ -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);

View File

@@ -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: { // 使用的武将等记录