diff --git a/package.json b/package.json index 5013855..b31a485 100644 --- a/package.json +++ b/package.json @@ -31,8 +31,8 @@ "author": "", "license": "ISC", "devDependencies": { - "@kevisual/logger": "^0.0.2", - "@kevisual/oss": "^0.0.7", + "@kevisual/logger": "^0.0.3", + "@kevisual/oss": "^0.0.11", "@rollup/plugin-commonjs": "^28.0.3", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^16.0.1", @@ -55,10 +55,12 @@ "@kevisual/query-config": "^0.0.2", "@kevisual/router": "0.0.14", "@kevisual/use-config": "^1.0.15", + "@types/lodash-es": "^4.17.12", "archiver": "^7.0.1", "busboy": "^1.6.0", "cookie": "^1.0.2", "ioredis": "^5.6.1", + "lodash-es": "^4.17.21", "minio": "^8.0.5", "nanoid": "^5.1.5", "send": "^1.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f67d54d..68b0d03 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -29,6 +29,9 @@ importers: '@kevisual/use-config': specifier: ^1.0.15 version: 1.0.15(dotenv@16.4.7) + '@types/lodash-es': + specifier: ^4.17.12 + version: 4.17.12 archiver: specifier: ^7.0.1 version: 7.0.1 @@ -41,6 +44,9 @@ importers: ioredis: specifier: ^5.6.1 version: 5.6.1 + lodash-es: + specifier: ^4.17.21 + version: 4.17.21 minio: specifier: ^8.0.5 version: 8.0.5 @@ -55,11 +61,11 @@ importers: version: 6.37.7(pg@8.13.3) devDependencies: '@kevisual/logger': - specifier: ^0.0.2 - version: 0.0.2 + specifier: ^0.0.3 + version: 0.0.3 '@kevisual/oss': - specifier: ^0.0.7 - version: 0.0.7 + specifier: ^0.0.11 + version: 0.0.11 '@rollup/plugin-commonjs': specifier: ^28.0.3 version: 28.0.3(rollup@4.40.2) @@ -131,11 +137,11 @@ packages: '@kevisual/load@0.0.6': resolution: {integrity: sha512-+3YTFehRcZ1haGel5DKYMUwmi5i6f2psyaPZlfkKU/cOXgkpwoG9/BEqPCnPjicKqqnksEpixVRkyHJ+5bjLVA==} - '@kevisual/logger@0.0.2': - resolution: {integrity: sha512-4NVdNsOHmMRg+OuZPoNNdI3p7jRII7lMJHRar1IoBck7fFIV7YGMNQirrrjk07MHv+Eh+U+uUljjgEWbse92RA==} + '@kevisual/logger@0.0.3': + resolution: {integrity: sha512-8emqxg+ab62WAK6VY4FQqetXPSSVKFAjGctD1NDbdnxt7YWuI/PyuDltCpsVz+uvWpV1dO5OKZOoHU7ow59Omw==} - '@kevisual/oss@0.0.7': - resolution: {integrity: sha512-saPN4A1CaGvSkFZzLE4zMsm+WwXi6Z97Yavz6koWFziuJIi/ay0793A4EDZ0iIpE9MMTRLYsuSQTUxDzsZV4Kg==} + '@kevisual/oss@0.0.11': + resolution: {integrity: sha512-oxC6KVTNeDUaoAAVHyNVhSg9JPj1FzwbP5PkYvTj2VHC3PvFtvG//m6Zii7yKpFv7itKzMuS7/9xDMdI5lPhaA==} '@kevisual/permission@0.0.1': resolution: {integrity: sha512-nSX2LzbPkU3YAMegbUFGU8tfmtFb7dcF5edqzm+gI6crcyCL1JzIB9HAYNEeEVIljLxuREwM/vVg9aFmF4cz9Q==} @@ -330,6 +336,12 @@ packages: '@types/http-proxy@1.17.16': resolution: {integrity: sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==} + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash@4.17.16': + resolution: {integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==} + '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} @@ -856,6 +868,9 @@ packages: resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} engines: {node: '>= 0.6.3'} + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} @@ -1478,9 +1493,9 @@ snapshots: dependencies: eventemitter3: 5.0.1 - '@kevisual/logger@0.0.2': {} + '@kevisual/logger@0.0.3': {} - '@kevisual/oss@0.0.7': {} + '@kevisual/oss@0.0.11': {} '@kevisual/permission@0.0.1': {} @@ -1636,6 +1651,12 @@ snapshots: dependencies: '@types/node': 22.15.17 + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.16 + + '@types/lodash@4.17.16': {} + '@types/mime@1.3.5': {} '@types/ms@2.1.0': {} @@ -2167,6 +2188,8 @@ snapshots: dependencies: readable-stream: 2.3.8 + lodash-es@4.17.21: {} + lodash.defaults@4.2.0: {} lodash.isarguments@3.1.0: {} diff --git a/src/module/proxy/ai-proxy.ts b/src/module/proxy/ai-proxy.ts index 785e820..3d8c00a 100644 --- a/src/module/proxy/ai-proxy.ts +++ b/src/module/proxy/ai-proxy.ts @@ -74,14 +74,14 @@ export const getMetadata = (pathname: string) => { if (isHtml) { meta = { ...meta, - 'Content-Type': 'text/html; charset=utf-8', - 'Cache-Control': 'no-cache', + 'content-type': 'text/html; charset=utf-8', + 'cache-control': 'no-cache', }; } else { meta = { ...meta, - 'Content-Type': getContentType(pathname), - 'Cache-Control': 'max-age=31536000, immutable', + 'content-type': getContentType(pathname), + 'cache-control': 'max-age=31536000, immutable', }; } return meta; @@ -118,10 +118,18 @@ export const postProxy = async (req: IncomingMessage, res: ServerResponse, opts: res.writeHead(code, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ code: code, data: data, message: message || 'success' })); }; + let statMeta: any = {}; if (!force) { - const check = await oss.checkObjectHash(objectName, hash); - if (check) { - return end({ success: true, hash }, '文件已存在'); + const check = await oss.checkObjectHash(objectName, hash, meta); + statMeta = check?.metaData || {}; + let isNewMeta = false; + if (check.success && JSON.stringify(meta) !== '{}' && !check.equalMeta) { + meta = { ...statMeta, ...getMetadata(pathname), ...meta }; + isNewMeta = true; + await oss.replaceObject(objectName, { ...meta }); + } + if (check.success) { + return end({ success: true, hash, meta, isNewMeta, equalMeta: check.equalMeta }, '文件已存在'); } } const bb = busboy({ @@ -135,16 +143,19 @@ export const postProxy = async (req: IncomingMessage, res: ServerResponse, opts: bb.on('file', async (name, file, info) => { fileProcessed = true; try { + // console.log('file', stat?.metaData); + // await sleep(2000); await oss.putObject( objectName, file, { + ...statMeta, ...getMetadata(pathname), ...meta, }, - { check: true, isStream: true }, + { check: false, isStream: true }, ); - end({ success: true, name, info }, '上传成功', 200); + end({ success: true, name, info, meta: meta?.metaData, statMeta }, '上传成功', 200); } catch (error) { end({ error: error }, '上传失败', 500); }