From 67ebed8d73c42b7734dadca146c52f2dc42b39e6 Mon Sep 17 00:00:00 2001 From: abearxiong Date: Mon, 30 Mar 2026 21:46:15 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20sendOss=20?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E5=92=8C=E6=96=87=E4=BB=B6=E6=B5=81=E8=AF=BB?= =?UTF-8?q?=E5=8F=96=E8=B7=AF=E7=94=B1=EF=BC=8C=E6=94=AF=E6=8C=81=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=8F=91=E9=80=81=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/fm-manager/proxy/ai-proxy.ts | 17 ++++++++++++++ src/routes/file/stream.ts | 29 ++++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 src/routes/file/stream.ts diff --git a/src/modules/fm-manager/proxy/ai-proxy.ts b/src/modules/fm-manager/proxy/ai-proxy.ts index ba1eb13..eee84523 100644 --- a/src/modules/fm-manager/proxy/ai-proxy.ts +++ b/src/modules/fm-manager/proxy/ai-proxy.ts @@ -391,3 +391,20 @@ export const aiProxy = async (req: IncomingMessage, res: ServerResponse, opts: P return getAiProxy(req, res, opts); }; + + +type SendOssOptions = { + /** + * 文件路径,必须 + * 例如:/root/resources/demo/1.0.0/readme.md + */ + filepath: string; + user?: { + username?: string; + id?: string; + } +} +// TODO: 这个函数需要重构,应该放在一个独立的模块中,需要完善权限校验等功能,单实现文件发送功能 +export const sendOss = async (res: ServerResponse, opts: SendOssOptions) => { + +} \ No newline at end of file diff --git a/src/routes/file/stream.ts b/src/routes/file/stream.ts new file mode 100644 index 0000000..5a1ef21 --- /dev/null +++ b/src/routes/file/stream.ts @@ -0,0 +1,29 @@ +import { app } from '@/app.ts'; +import { getFileStat, getMinioList, deleteFile, updateFileStat, deleteFileByPrefix } from './module/get-minio-list.ts'; +import path from 'path'; +import { CustomError } from '@kevisual/router'; +import { callDetectAppVersion } from '../app-manager/export.ts'; +import { UserId } from '../user/modules/user-id.ts'; +import { z } from 'zod'; +import { sendOss } from '@/modules/fm-manager/index.ts'; +app.route({ + path: 'file', + key: 'stream', + description: '文件读取,图片,文件等非文本文件的读取,返回文件流,send file 到前端', + middleware: ['auth'], + metadata: { + args: { + name: z.string().describe('文件路径, 例如/root/resources/demo/1.0.0/readme.md'), + } + } +}).define(async (ctx) => { + const name = ctx.args.name + if (!name) { + ctx.res.statusCode = 400 + ctx.res.end('文件路径是必填项') + return + } + let objectName = name; + const tokenUser = ctx.state.tokenUser; + await sendOss(ctx.res, { filepath: objectName, user: tokenUser }); +}).addTo(app) \ No newline at end of file