diff --git a/packages/plugins/@nocobase/plugin-file-manager/src/server/__tests__/action.test.ts b/packages/plugins/@nocobase/plugin-file-manager/src/server/__tests__/action.test.ts index a42adfaba23..4650d05b05f 100644 --- a/packages/plugins/@nocobase/plugin-file-manager/src/server/__tests__/action.test.ts +++ b/packages/plugins/@nocobase/plugin-file-manager/src/server/__tests__/action.test.ts @@ -216,6 +216,33 @@ describe('action', () => { // const res2 = await agent.get(`${DEFAULT_LOCAL_BASE_URL}${body.data.path}/${encodedFilename}`); // expect(res2.text).toBe(rawText); }); + + it('create file record should be ok', async () => { + db.collection({ + name: 'customers', + fields: [ + { + name: 'avatar', + type: 'belongsTo', + target: 'attachments', + }, + ], + }); + const record = { + title: 'text', + extname: '.txt', + path: '', + // size: 13, + meta: {}, + storageId: 1, + }; + const { status, body } = await agent.resource('attachments').create({ + attachmentField: 'customers.avatar', + values: record, + }); + expect(status).toBe(200); + expect(body.data).toMatchObject(record); + }); }); describe('specific storage', () => { diff --git a/packages/plugins/@nocobase/plugin-file-manager/src/server/actions/attachments.ts b/packages/plugins/@nocobase/plugin-file-manager/src/server/actions/attachments.ts index b84c5175f19..76e75ace534 100644 --- a/packages/plugins/@nocobase/plugin-file-manager/src/server/actions/attachments.ts +++ b/packages/plugins/@nocobase/plugin-file-manager/src/server/actions/attachments.ts @@ -87,14 +87,30 @@ export async function createMiddleware(ctx: Context, next: Next) { return next(); } + const storageName = + resourceName === 'attachments' + ? ctx.db.getFieldByPath(attachmentField)?.options?.storage + : collection.options.storage; + // const StorageRepo = ctx.db.getRepository('storages'); + // const storage = await StorageRepo.findOne({ filter: storageName ? { name: storageName } : { default: true } }); const plugin = ctx.app.pm.get(Plugin) as Plugin; - const storageName = ctx.db.getFieldByPath(attachmentField)?.options?.storage || collection.options.storage; - const storages = Array.from(plugin.storagesCache.values()); - ctx.storage = storages.find((item) => item.name === storageName) || storages.find((item) => item.default); + const storage = Array.from(plugin.storagesCache.values()).find((storage) => + storageName ? storage.name === storageName : storage.default, + ); + if (!storage) { + ctx.logger.error(`[file-manager] no storage found`); + return ctx.throw(500); + } + ctx.storage = storage; if (ctx?.request.is('multipart/*')) { await multipart(ctx, next); } else { + ctx.action.mergeParams({ + values: { + storage: { id: storage.id }, + }, + }); await next(); } } diff --git a/packages/plugins/@nocobase/plugin-file-manager/src/server/storages/index.ts b/packages/plugins/@nocobase/plugin-file-manager/src/server/storages/index.ts index 47f79dcfe55..69b3d3d5283 100644 --- a/packages/plugins/@nocobase/plugin-file-manager/src/server/storages/index.ts +++ b/packages/plugins/@nocobase/plugin-file-manager/src/server/storages/index.ts @@ -7,12 +7,12 @@ * For more information, please refer to: https://www.nocobase.com/agreement. */ -import { isURL } from '@nocobase/utils'; import axios, { AxiosRequestConfig } from 'axios'; -import { StorageEngine } from 'multer'; import Path from 'path'; +import { StorageEngine } from 'multer'; import type { Readable } from 'stream'; import urlJoin from 'url-join'; +import { isURL } from '@nocobase/utils'; import { encodeURL, ensureUrlEncoded, getFileKey } from '../utils'; export interface StorageModel { id?: number;