From a13aacbc3bb9f1a8461123f43b79d311c54ea3f1 Mon Sep 17 00:00:00 2001 From: sliverp Date: Fri, 30 Jan 2026 14:53:13 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=B8=8B=E8=BD=BD=E9=99=84=E4=BB=B6?= =?UTF-8?q?=E6=97=B6=E4=BF=9D=E7=95=99=E5=8E=9F=E5=A7=8B=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=90=8D=E5=B9=B6=E6=B7=BB=E5=8A=A0=E6=97=B6=E9=97=B4=E6=88=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gateway.ts | 4 ++-- src/image-server.ts | 22 ++++++++++++---------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/gateway.ts b/src/gateway.ts index 31c91da..2ee6ecb 100644 --- a/src/gateway.ts +++ b/src/gateway.ts @@ -254,8 +254,8 @@ MEDIA:/绝对路径/图片文件.png if (event.attachments?.length) { for (const att of event.attachments) { - // 下载附件到本地 - const localPath = await downloadFile(att.url, downloadDir); + // 下载附件到本地,使用原始文件名 + const localPath = await downloadFile(att.url, downloadDir, att.filename); if (localPath) { if (att.content_type?.startsWith("image/")) { imageUrls.push(localPath); diff --git a/src/image-server.ts b/src/image-server.ts index 0a523e2..8bda378 100644 --- a/src/image-server.ts +++ b/src/image-server.ts @@ -389,13 +389,13 @@ export function isImageServerRunning(): boolean { * 下载远程文件并保存到本地 * @param url 远程文件 URL * @param destDir 目标目录 - * @param filename 文件名(可选,不含扩展名) + * @param originalFilename 原始文件名(可选,完整文件名包含扩展名) * @returns 本地文件路径,失败返回 null */ export async function downloadFile( url: string, destDir: string, - filename?: string + originalFilename?: string ): Promise { try { // 确保目录存在 @@ -412,22 +412,24 @@ export async function downloadFile( const buffer = Buffer.from(await response.arrayBuffer()); - // 直接从 URL 提取原始文件名 + // 确定文件名 let finalFilename: string; - if (filename) { - finalFilename = filename; + if (originalFilename) { + // 使用原始文件名,但添加时间戳避免冲突 + const ext = path.extname(originalFilename); + const baseName = path.basename(originalFilename, ext); + const timestamp = Date.now(); + finalFilename = `${baseName}_${timestamp}${ext}`; } else { - // 从 URL 路径中提取文件名(去掉查询参数) - const urlPath = new URL(url).pathname; - const urlFilename = path.basename(urlPath); - // 如果 URL 有文件名就用,否则生成随机名 - finalFilename = urlFilename && urlFilename !== "/" ? urlFilename : `${generateImageId()}.bin`; + // 没有原始文件名,生成随机名 + finalFilename = `${generateImageId()}.bin`; } const filePath = path.join(destDir, finalFilename); // 保存文件 fs.writeFileSync(filePath, buffer); + console.log(`[image-server] Downloaded file: ${filePath}`); return filePath; } catch (err) {