From dc479ffbdb1149eac21a218c63bfa64d473e4769 Mon Sep 17 00:00:00 2001 From: Jerryplusy Date: Sat, 11 Oct 2025 23:11:48 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E6=96=87=E4=BB=B6=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/openlist/openlist.utils.ts | 12 ++++++-- src/modules/meme/meme.controller.ts | 46 ++++++++++++----------------- 2 files changed, 28 insertions(+), 30 deletions(-) diff --git a/src/core/openlist/openlist.utils.ts b/src/core/openlist/openlist.utils.ts index 491dad9..24112a3 100644 --- a/src/core/openlist/openlist.utils.ts +++ b/src/core/openlist/openlist.utils.ts @@ -162,10 +162,13 @@ export class OpenListUtils { file: fs.ReadStream, ): Promise { const url = `${this.apiBaseUrl}/api/fs/put`; + const stats = fs.statSync(filePath); + const fileSize = stats.size; + const headers = { Authorization: `${token}`, 'Content-Type': 'application/octet-stream', - 'Content-Length': file.bytesRead, + 'Content-Length': fileSize, 'File-Path': encodeURIComponent(filePathOnServer), }; @@ -174,14 +177,17 @@ export class OpenListUtils { headers, params: { path: filePath, - 'As-Task': 'true', //作为任务 + 'As-Task': 'true', }, + maxBodyLength: Infinity, + maxContentLength: Infinity, }); + this.logger.log(`文件上传成功: ${filePathOnServer}`); return response.data; } catch (error) { this.logger.error('上传文件失败..', error); - throw new Error('上传文件失败..'); + throw new Error(`上传文件失败: ${error.message || error}`); } } } diff --git a/src/modules/meme/meme.controller.ts b/src/modules/meme/meme.controller.ts index 1dff80c..9a3e463 100644 --- a/src/modules/meme/meme.controller.ts +++ b/src/modules/meme/meme.controller.ts @@ -186,7 +186,6 @@ export class MemeController { * @param file * @param character * @param status - * @param token * @param res */ @Post('upload') @@ -210,7 +209,6 @@ export class MemeController { @UploadedFile() file: Express.Multer.File, @Body('character') character: string, @Body('status') status: string, - @Body('token') token: string, @Res() res: Response, ) { if (!file) { @@ -218,7 +216,15 @@ export class MemeController { } try { - const buffer = file.buffer; + const fsp = fs.promises; + const safeCharacter = character?.trim() || 'unknown'; + const safeStatus = status?.trim() || 'default'; + + const memeBasePath = this.pathService.get('meme'); + const localDir = path.join(memeBasePath, safeCharacter, safeStatus); + await fsp.mkdir(localDir, { recursive: true }); + + const buffer = file.buffer || (await fsp.readFile(file.path)); const imgType = await imageType(buffer); if (!imgType || !['jpg', 'png', 'gif', 'webp'].includes(imgType.ext)) { throw new HttpException( @@ -226,16 +232,10 @@ export class MemeController { HttpStatus.UNSUPPORTED_MEDIA_TYPE, ); } - - const fsp = fs.promises; - const safeCharacter = character?.trim() || 'unknown'; - const safeStatus = status?.trim() || 'default'; - const tempDir = path.join(this.pathService.get('temp'), 'meme'); - await fsp.mkdir(tempDir, { recursive: true }); const remoteMemePath = this.configService.get('OPENLIST_API_MEME_PATH'); - const remoteDir = `${remoteMemePath}/${safeCharacter}/${safeStatus}/`; let fileList: string[] = []; + try { const listResult = await this.openListService.listFiles(remoteDir); if ( @@ -259,26 +259,18 @@ export class MemeController { const nextNumber = usedNumbers.length > 0 ? Math.max(...usedNumbers) + 1 : 1; - const filename = `${nextNumber}.${imgType.ext}`; - const tempFilePath = path.join(tempDir, filename); - await fsp.writeFile(tempFilePath, buffer); - //const openlistBasePath = this.configService.get('OPENLIST_API_BASE_PATH'); - - const openListTargetPath = `${remoteDir}${filename}`; - const fileStream = fs.createReadStream(tempFilePath); + const remoteFilename = `${nextNumber}.${imgType.ext}`; + const remoteFilePath = `${remoteDir}${remoteFilename}`; + const localFilePath = path.join(localDir, remoteFilename); + await fsp.writeFile(localFilePath, buffer); + const fileStream = fs.createReadStream(localFilePath); await this.openListService.uploadFile( - tempFilePath, + localFilePath, fileStream, - openListTargetPath, + remoteFilePath, ); - - await fsp.unlink(tempFilePath); - this.logger.log(`表情包上传成功: ${openListTargetPath}`); - return res.status(200).json({ - message: '表情上传成功!', - path: openListTargetPath, - filename, - }); + this.logger.log(`表情包上传成功: ${remoteFilePath}`); + return '表情上传成功!'; } catch (error) { this.logger.error('表情包上传失败:', error); throw new HttpException(