From cbce560805b77745a0e9d3a6f0d7ce465db3b9ea Mon Sep 17 00:00:00 2001 From: CPTProgrammer <46586216+CPTProgrammer@users.noreply.github.com> Date: Sat, 11 Jul 2026 06:06:34 +0800 Subject: [PATCH] Replace Blob with File for file uploads --- src/lib/curseforge/file.ts | 8 +++----- src/lib/modrinth/version.ts | 13 +++++-------- src/lib/utils/file.ts | 9 +++++---- src/services/platforms/curseforge.ts | 6 +++--- src/services/platforms/modrinth.ts | 10 +++++----- 5 files changed, 21 insertions(+), 25 deletions(-) diff --git a/src/lib/curseforge/file.ts b/src/lib/curseforge/file.ts index 0ae3ee1..ed1f841 100644 --- a/src/lib/curseforge/file.ts +++ b/src/lib/curseforge/file.ts @@ -39,20 +39,18 @@ export async function getFiles( * @param client CurseForge 客户端实例 * @param projectId 项目 ID(数字) * @param metadata 已通过 Zod 校验的文件元数据 - * @param file 要上传的文件 Blob + * @param file 要上传的文件 */ export async function uploadFile( client: CurseForgeClient, projectId: number, metadata: UploadMetadata, - file: Blob, + file: File, ): Promise { const form = new FormData(); form.append("metadata", JSON.stringify(metadata)); - const filename = - file instanceof File ? file.name : "upload.jar"; - form.append("file", file, filename); + form.append("file", file, file.name); const result = await client.uploadPost( `/api/projects/${encodeURIComponent(projectId)}/upload-file`, diff --git a/src/lib/modrinth/version.ts b/src/lib/modrinth/version.ts index bac0196..6550d1a 100644 --- a/src/lib/modrinth/version.ts +++ b/src/lib/modrinth/version.ts @@ -90,12 +90,12 @@ export async function getVersions( * * @param client Modrinth 客户端实例 * @param data 已通过 Zod 校验的版本元数据(CreatableVersion) - * @param files 文件映射:key 为 multipart 字段名(需与 data.file_parts 一致),value 为文件 Blob + * @param files 文件映射:key 为 multipart 字段名(需与 data.file_parts 一致),value 为文件 */ export async function createVersion( client: ModrinthClient, data: CreatableVersion, - files: Record, + files: Record, ): Promise { const form = new FormData(); @@ -104,16 +104,13 @@ export async function createVersion( // 逐一添加文件 for (const fieldName of data.file_parts) { - const blob = files[fieldName]; - if (!blob) { + const file = files[fieldName]; + if (!file) { throw new Error( `createVersion: file field "${fieldName}" declared in file_parts but not provided in files`, ); } - // 从 Blob 推断文件名;若无则使用字段名作为回退 - const filename = - blob instanceof File ? blob.name : `${fieldName}.jar`; - form.append(fieldName, blob, filename); + form.append(fieldName, file, file.name); } const result = await client.post("/version", form); diff --git a/src/lib/utils/file.ts b/src/lib/utils/file.ts index 644eca0..cda9334 100644 --- a/src/lib/utils/file.ts +++ b/src/lib/utils/file.ts @@ -1,9 +1,10 @@ -import { readFileSync } from "node:fs"; +import { readFile } from "node:fs/promises"; +import { basename } from "node:path"; -export function readJarBlob(filePath: string): Blob { +export async function readAsFile(filePath: string): Promise { try { - const buffer = readFileSync(filePath); - return new Blob([buffer]); + const buffer = await readFile(filePath); + return new File([buffer], basename(filePath)); } catch (err) { const msg = err instanceof Error ? err.message : String(err); throw new Error(`Failed to read file "${filePath}": ${msg}`); diff --git a/src/services/platforms/curseforge.ts b/src/services/platforms/curseforge.ts index 6aefd92..cb1b7e5 100644 --- a/src/services/platforms/curseforge.ts +++ b/src/services/platforms/curseforge.ts @@ -1,7 +1,7 @@ import { curseforgeClient } from "@/services/clients"; import { uploadFile, getGameVersions } from "@/lib/curseforge"; import { resolveVersionName, buildJarPath } from "@/lib/utils/format"; -import { readJarBlob } from "@/lib/utils/file"; +import { readAsFile } from "@/lib/utils/file"; import type { UploadMetadata } from "@/types"; import type { PlatformContext } from "./types"; @@ -24,7 +24,7 @@ export async function publishCurseForgeVersion( mcVersion, ); - const primaryBlob = readJarBlob(primaryPath); + const primaryFile = await readAsFile(primaryPath); const gameVersions = await getGameVersions(curseforgeClient); @@ -51,6 +51,6 @@ export async function publishCurseForgeVersion( curseforgeClient, config.curseforge.project_id, metadata, - primaryBlob, + primaryFile, ); } diff --git a/src/services/platforms/modrinth.ts b/src/services/platforms/modrinth.ts index 03c123c..e22987d 100644 --- a/src/services/platforms/modrinth.ts +++ b/src/services/platforms/modrinth.ts @@ -1,7 +1,7 @@ import { modrinthClient } from "@/services/clients"; import { createVersion } from "@/lib/modrinth"; import { resolveVersionName, buildJarPath } from "@/lib/utils/format"; -import { readJarBlob } from "@/lib/utils/file"; +import { readAsFile } from "@/lib/utils/file"; import type { CreatableVersion } from "@/types"; import type { PlatformContext } from "./types"; @@ -40,8 +40,8 @@ export async function publishModrinthVersion( mcVersion, ); - const primaryBlob = readJarBlob(primaryPath); - const sourceBlob = readJarBlob(sourcePath); + const primaryFile = await readAsFile(primaryPath); + const sourceFile = await readAsFile(sourcePath); const data: CreatableVersion = { project_id: config.modrinth.project_id, @@ -65,7 +65,7 @@ export async function publishModrinthVersion( }; await createVersion(modrinthClient, data, { - primary: primaryBlob, - sources: sourceBlob, + primary: primaryFile, + sources: sourceFile, }); }