diff --git a/packages/drizzle-pkg/db.sqlite b/packages/drizzle-pkg/db.sqlite index 3f8aa14..b1eb4fa 100644 Binary files a/packages/drizzle-pkg/db.sqlite and b/packages/drizzle-pkg/db.sqlite differ diff --git a/server/api/file/upload.post.ts b/server/api/file/upload.post.ts index b3b1bca..cfe679d 100644 --- a/server/api/file/upload.post.ts +++ b/server/api/file/upload.post.ts @@ -102,6 +102,8 @@ export default defineWrappedResponseHandler(async (event) => { const stem = path.parse(file.filename).name; const finalName = `${stem}.webp`; const finalPath = path.join(uploadDir, finalName); + // sharp 不允许输入与输出指向同一路径(常见于原图本身就是 webp) + const tempOutputPath = file.path === finalPath ? path.join(uploadDir, `${stem}-converted.webp`) : finalPath; try { await sharp(file.path) @@ -113,11 +115,11 @@ export default defineWrappedResponseHandler(async (event) => { withoutEnlargement: true, }) .webp({ quality: MEDIA_WEBP_QUALITY }) - .toFile(finalPath); + .toFile(tempOutputPath); } catch (procErr) { - if (fs.existsSync(finalPath)) { + if (fs.existsSync(tempOutputPath)) { try { - fs.unlinkSync(finalPath); + fs.unlinkSync(tempOutputPath); } catch { /* ignore */ } @@ -126,6 +128,17 @@ export default defineWrappedResponseHandler(async (event) => { throw createError({ statusCode: 400, statusMessage: msg }); } + if (tempOutputPath !== finalPath) { + if (fs.existsSync(finalPath)) { + try { + fs.unlinkSync(finalPath); + } catch { + /* ignore */ + } + } + fs.renameSync(tempOutputPath, finalPath); + } + if (file.path !== finalPath) { try { fs.unlinkSync(file.path);