From 327fec1feaa84a7062abedb6fbcba304fe1229cd Mon Sep 17 00:00:00 2001 From: undefined Date: Wed, 2 Sep 2020 23:12:39 +0800 Subject: [PATCH] =?UTF-8?q?fs=5Fupload=E6=94=AF=E6=8C=81redirect=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=EF=BC=8C=E6=B7=BB=E5=8A=A0stream2buffer=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/fps-importer/handler.ts | 16 +++++++++++++--- packages/fps-importer/package.json | 3 ++- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/handler/misc.ts | 8 +++++++- packages/hydrooj/src/utils.ts | 9 +++++++++ 5 files changed, 32 insertions(+), 6 deletions(-) diff --git a/packages/fps-importer/handler.ts b/packages/fps-importer/handler.ts index f4f0c57d3..56a113210 100644 --- a/packages/fps-importer/handler.ts +++ b/packages/fps-importer/handler.ts @@ -4,18 +4,28 @@ import os from 'os'; import fs from 'fs-extra'; import AdmZip from 'adm-zip'; import xml2js from 'xml2js'; +import { ObjectID } from 'mongodb'; import { LocalProblemConfig } from 'hydrooj'; import { Route, Handler, param, Types, } from 'hydrooj/dist/service/server'; +import { streamToBuffer } from 'hydrooj/dist/utils'; +import * as file from 'hydrooj/dist/model/file'; import { PERM } from 'hydrooj/dist/model/builtin'; class FpsProblemImportHandler extends Handler { - async get() { - this.response.template = 'problem_import_fps.html'; + @param('ufid', Types.ObjectID, true) + async get(domainId: string, ufid?: ObjectID) { + if (ufid) { + const stream = await file.get(ufid); + const buf = await streamToBuffer(stream); + // @ts-ignore + await this.post({ domainId, input: buf.toString() }); + await file.del(ufid); + } else this.response.template = 'problem_import_fps.html'; } - @param('input', Types.String) + @param('input', Types.String, true) async post(domainId: string, input: string) { const result = await xml2js.parseStringPromise(input); const problem = global.Hydro.model.problem; diff --git a/packages/fps-importer/package.json b/packages/fps-importer/package.json index 711357e98..79ffe4d76 100644 --- a/packages/fps-importer/package.json +++ b/packages/fps-importer/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/fps-importer", - "version": "1.0.4", + "version": "1.0.5", "description": "Import FPS problems", "main": "package.json", "repository": "https://github.com/hydro-dev/Hydro.git", @@ -10,6 +10,7 @@ "adm-zip": "^0.4.16", "fs-extra": "^9.0.1", "hydrooj": "^2.12.22", + "mongodb": "^3.6.1", "xml2js": "^0.4.23" }, "devDependencies": { diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 684aca2c6..965ad3abc 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.12.24", + "version": "2.12.25", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/handler/misc.ts b/packages/hydrooj/src/handler/misc.ts index 3988be73e..71df6a2d7 100644 --- a/packages/hydrooj/src/handler/misc.ts +++ b/packages/hydrooj/src/handler/misc.ts @@ -39,7 +39,8 @@ class FileUploadHandler extends Handler { } @param('title', Types.String) - async post(domainId: string, title: string) { + @param('redirect', Types.String, true) + async post(domainId: string, title: string, redirect?: string) { if (!this.request.files.file) throw new BadRequestError(); const quota = await this.getQuota(); const lfdoc = await fs.promises.stat(this.request.files.file.path); @@ -53,6 +54,11 @@ class FileUploadHandler extends Handler { } const fdoc = await file.getMeta(ufid); this.response.template = 'fs_upload.html'; + if (redirect) { + this.response.redirect = redirect.includes('?') + ? `${redirect}&ufid=${ufid}` + : `${redirect}?ufid=${ufid}`; + } this.response.body = { fdoc, ufid, usage: udoc.usage, quota, }; diff --git a/packages/hydrooj/src/utils.ts b/packages/hydrooj/src/utils.ts index e18ff292e..bd3b4cd9d 100644 --- a/packages/hydrooj/src/utils.ts +++ b/packages/hydrooj/src/utils.ts @@ -170,3 +170,12 @@ export function isClass(obj: any, strict = false) { } return false; } + +export function streamToBuffer(stream): Promise { + return new Promise((resolve, reject) => { + const buffers = []; + stream.on('error', reject); + stream.on('data', (data) => buffers.push(data)); + stream.on('end', () => resolve(Buffer.concat(buffers))); + }); +}