From 50d0536a3bc29b0fe6ac4a6294a52bde1edfe2d8 Mon Sep 17 00:00:00 2001 From: undefined Date: Mon, 14 Apr 2025 19:22:11 +0800 Subject: [PATCH] fix zip utils --- framework/framework/base.ts | 2 +- packages/hydrooj/src/model/problem.ts | 7 +++++-- packages/utils/lib/utils.ts | 2 ++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/framework/framework/base.ts b/framework/framework/base.ts index b7413117b..ef53058a4 100644 --- a/framework/framework/base.ts +++ b/framework/framework/base.ts @@ -112,7 +112,7 @@ export default (logger, xff, xhost) => async (ctx: KoaContext, next: Next) => { ctx.response.status = 302; ctx.redirect(response.redirect); } else if (response.body) { - ctx.body = response.body; + ctx.body = response.body instanceof Blob ? Buffer.from(await response.body.arrayBuffer()) : response.body; ctx.response.status = response.status || 200; ctx.response.type = response.type || (request.json diff --git a/packages/hydrooj/src/model/problem.ts b/packages/hydrooj/src/model/problem.ts index 45d9d33a7..5673701f5 100644 --- a/packages/hydrooj/src/model/problem.ts +++ b/packages/hydrooj/src/model/problem.ts @@ -454,6 +454,7 @@ export class ProblemModel { const { preferredPrefix, progress, override = false, operator = 1, } = options; + let delSource = options.delSource; let problems: string[]; try { if (filepath.endsWith('.zip')) { @@ -465,6 +466,7 @@ export class ProblemModel { } catch (e) { throw new ValidationError('zip', null, e.message); } + delSource = true; await extractZip(entries, tmpdir); } else if (fs.statSync(filepath).isDirectory()) { tmpdir = filepath; @@ -478,7 +480,8 @@ export class ProblemModel { problems = files.filter((f) => f.isDirectory()).map((i) => i.name); } } catch (e) { - if (options.delSource) await fs.remove(tmpdir); + if (delSource) await fs.remove(tmpdir); + throw e; } for (const i of problems) { try { @@ -622,7 +625,7 @@ export class ProblemModel { (process.env.HYDRO_CLI ? logger.info : progress)?.(`Error importing problem ${i}: ${e.message}`); } } - if (options.delSource) await fs.remove(tmpdir); + if (delSource) await fs.remove(tmpdir); } static async export(domainId: string, pidFilter = '') { diff --git a/packages/utils/lib/utils.ts b/packages/utils/lib/utils.ts index c74126083..d8b308c99 100644 --- a/packages/utils/lib/utils.ts +++ b/packages/utils/lib/utils.ts @@ -348,6 +348,8 @@ export async function extractZip(zipOrEntries: ZipReader | Entry[], dest: continue; } if (fs.existsSync(d) && !overwrite) continue; + const dir = path.dirname(d); + if (!fs.existsSync(dir)) await fs.mkdir(dir, { recursive: true }); const content = await entry.getData(Writable.toWeb(fs.createWriteStream(d)), { signal }); if (!content) throw new Error('CANT_EXTRACT_FILE'); await fs.utimes(d, entry.lastModDate, entry.lastModDate);