后台:json上传

This commit is contained in:
luying
2021-05-12 17:57:25 +08:00
parent 2fc5017af8
commit 148a11edab
102 changed files with 1675 additions and 1117 deletions

View File

@@ -2,14 +2,19 @@ import { Controller } from 'egg';
import { Stream } from 'stream';
import { STATUS } from '@consts';
const fs = require('fs');
const path = require('path');
const unzip = require("unzip-stream");
const temp = require('temp');
const compressing = require("compressing");
const moment = require("moment");
const pump = require('mz-modules/pump');
const folderName = 'hot_update_files';
const hotUpdateAddr = `/root/${folderName}`;
const publishPath = '/root/hot_update_backup';
import {exec} from 'child_process'
import { reloadResources } from '@pubUtils/data';
const sendToWormhole = require('stream-wormhole');
export default class UploadController extends Controller {
@@ -154,46 +159,121 @@ export default class UploadController extends Controller {
})
}
private jsonFolderName = 'resource';
private jsonFolderPath = `/root/zyz/shared/${this.jsonFolderName}`;
private jsonFolder = '/app/resource/jsons';
private warjsonFolder = '/app/resource/warJsons';
private tsFolder = '/app/pubUtils';
private distJsonFolder = `/../game-server/dist${this.jsonFolder}`;
private distWarjsonFolder = `/../game-server/dist${this.warjsonFolder}`;
private distTsFolder = `/../game-server/dist${this.tsFolder}`;
public async uploadJson() {
const { ctx } = this;
const stream = await ctx.getFileStream();
// const filename = stream.filename;
// const target = path.join(url, filename);
const parts = ctx.multipart({ });
const files = [];
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);
try {
let stream;
while ((stream = await parts()) != null) {
const filename = stream.filename;
let filenameWithoutEx = filename?filename.split('.')[0]:'';
if (stream.mimeType == 'application/json') {
if (filenameWithoutEx.match(/^\d{1,}$/)) {
let target1 = path.join(this.config.baseDir, this.warjsonFolder, filename);
let target2 = path.join(this.config.baseDir, this.distWarjsonFolder, filename);
const writeStream = fs.createWriteStream(target1);
await pump(stream, writeStream);
fs.copyFileSync(target1, target2);
// files.push(filename);
} else {
let target1 = path.join(this.config.baseDir, this.jsonFolder, filename);
let target2 = path.join(this.config.baseDir, this.distJsonFolder, filename);
const writeStream = fs.createWriteStream(target1);
await pump(stream, writeStream);
fs.copyFileSync(target1, target2);
files.push(filename);
}
} else if (stream.mimeType == 'application/octet-stream') {
let target1 = path.join(this.config.baseDir, this.tsFolder, filename);
let target2 = path.join(this.config.baseDir, this.distTsFolder, filename);
const writeStream = fs.createWriteStream(target1);
await pump(stream, writeStream);
fs.copyFileSync(target1, target2);
files.push(filename);
}
for (let {path, name} of files) {
console.log(`${this.jsonFolderPath}/${name}`);
fs.renameSync(path, `${this.jsonFolderPath}/${name}`);
}
temp.cleanupSync();
return ctx.body = ctx.service.utils.resResult(STATUS.SUCCESS, {
"files": JSON.stringify(files)
});
} catch (err) {
console.log(err)
return ctx.body = ctx.service.utils.resResult(STATUS.INTERNAL_ERR);
sendToWormhole(stream);
}
} else {
return ctx.body = ctx.service.utils.resResult(STATUS.GM_UPLOAD_FORMAT_ERR);
}catch(e) {
console.error(e);
}
return ctx.body = ctx.service.utils.resResult(STATUS.SUCCESS, {
"files": files
});
// console.log('****', stream);
// // 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 = ctx.service.utils.resResult(STATUS.SUCCESS, {
// "files": JSON.stringify(files)
// });
// } catch (err) {
// console.log(err)
// return ctx.body = ctx.service.utils.resResult(STATUS.INTERNAL_ERR);
// }
// } else {
// return ctx.body = ctx.service.utils.resResult(STATUS.GM_UPLOAD_FORMAT_ERR);
// }
}
public async reloadResource() {
const { ctx } = this;
try {
reloadResources();
ctx.body = ctx.service.utils.resResult(STATUS.SUCCESS, { isOK: true });
return;
} catch(e) {
ctx.body = ctx.service.utils.resResult(STATUS.SUCCESS, { isOK: false, err: e.stack });
return;
}
}
}
export function childExec(commond: string) {
return new Promise((resolve, reject) => {
exec(commond, function(error, stdout, stderr){
if(error) {
reject(error);
return;
}
console.log('stdout: ' + stdout);
console.log('stderr: ' + typeof stderr);
resolve(stdout);
});
})
}

View File

@@ -11,6 +11,7 @@ export default (app: Application) => {
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/upload/reloadresource', tokenParser, controller.upload.reloadResource);
router.post('/api/gmaccount/getgmlist', tokenParser, controller.gmaccount.getGmList);
router.post('/api/gmaccount/createaccount',tokenParser, controller.gmaccount.createGmAccount);

View File

@@ -37,7 +37,11 @@ export default (appInfo: EggAppInfo) => {
config.multipart = {
fileSize: '100mb',
mode: 'stream',
fileExtensions: ['.zip', '.tar.gz'], // 扩展几种上传的文件格式
whitelist: [
'.json', '.ts', '.zip'
],
fileExtensions: ['.json', '.ts', '.zip', '.tar.gz'], // 扩展几种上传的文件格式
autoFields: true
};
config.alinode = {

View File

@@ -2698,6 +2698,11 @@
"integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
"dev": true
},
"child_process": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz",
"integrity": "sha1-sffn/HPSXn/R1FWtyU4UODAYK1o="
},
"chokidar": {
"version": "2.1.8",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",

View File

@@ -26,6 +26,7 @@
"dependencies": {
"await-stream-ready": "^1.0.1",
"bcrypt": "^5.0.0",
"child_process": "^1.0.2",
"compressing": "^1.5.1",
"csprng": "^0.1.2",
"egg": "^2.6.1",
@@ -35,6 +36,7 @@
"moment": "^2.29.0",
"pump": "^3.0.0",
"reflect-metadata": "^0.1.13",
"stream-wormhole": "^1.1.0",
"temp": "^0.9.1",
"underscore": "^1.12.0",
"unzip-stream": "^0.3.0"