Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
赵月辉
/
fastgpt-migrated
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Unverified
Commit
5a048432
authored
Aug 06, 2026
by
Xianquan
Committed by
GitHub
Aug 06, 2026
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix: allow file variable uploads after publish (#7467)
parent
337cd100
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
77 additions
and
1 deletions
+77
-1
projects/app/src/pages/api/core/chat/file/presignChatFilePostUrl.ts
+45
-1
projects/app/test/pages/api/core/chat/file/presignChatFilePostUrl.test.ts
+32
-0
No files found.
projects/app/src/pages/api/core/chat/file/presignChatFilePostUrl.ts
View file @
5a048432
...
@@ -13,6 +13,50 @@ import { createAuthorizedChatFileUploadUrl } from '@/service/core/chat/file/uplo
...
@@ -13,6 +13,50 @@ import { createAuthorizedChatFileUploadUrl } from '@/service/core/chat/file/uplo
import
{
AppTypeEnum
}
from
'@fastgpt/global/core/app/constants'
;
import
{
AppTypeEnum
}
from
'@fastgpt/global/core/app/constants'
;
import
{
homeChatFileSelectConfig
}
from
'@fastgpt/global/core/chat/setting/constants'
;
import
{
homeChatFileSelectConfig
}
from
'@fastgpt/global/core/chat/setting/constants'
;
import
{
MongoChatSetting
}
from
'@fastgpt/service/core/chat/setting/schema'
;
import
{
MongoChatSetting
}
from
'@fastgpt/service/core/chat/setting/schema'
;
import
{
VariableInputEnum
}
from
'@fastgpt/global/core/workflow/constants'
;
import
type
{
AppFileSelectConfigType
}
from
'@fastgpt/global/core/app/type/config.schema'
;
/**
* 合并应用级文件上传配置和文件变量配置。
* 文件变量可以独立声明允许的文件类型;发布后的上传授权必须同时识别这两种配置,
* 否则工具运行页虽能渲染文件输入,预签名接口仍会误判为未开启文件上传。
*/
const
getPublishedFileSelectConfig
=
({
chatConfig
}:
{
chatConfig
?:
{
fileSelectConfig
?:
AppFileSelectConfigType
;
variables
?:
Array
<
AppFileSelectConfigType
&
{
type
?:
VariableInputEnum
}
>
;
};
}):
AppFileSelectConfigType
|
undefined
=>
{
const
fileVariables
=
chatConfig
?.
variables
?.
filter
(
(
item
)
=>
item
.
type
===
VariableInputEnum
.
file
);
if
(
!
fileVariables
?.
length
)
return
chatConfig
?.
fileSelectConfig
;
return
{
...
chatConfig
?.
fileSelectConfig
,
canSelectFile
:
!!
chatConfig
?.
fileSelectConfig
?.
canSelectFile
||
fileVariables
.
some
((
item
)
=>
item
.
canSelectFile
),
canSelectImg
:
!!
chatConfig
?.
fileSelectConfig
?.
canSelectImg
||
fileVariables
.
some
((
item
)
=>
item
.
canSelectImg
),
canSelectVideo
:
!!
chatConfig
?.
fileSelectConfig
?.
canSelectVideo
||
fileVariables
.
some
((
item
)
=>
item
.
canSelectVideo
),
canSelectAudio
:
!!
chatConfig
?.
fileSelectConfig
?.
canSelectAudio
||
fileVariables
.
some
((
item
)
=>
item
.
canSelectAudio
),
canSelectCustomFileExtension
:
!!
chatConfig
?.
fileSelectConfig
?.
canSelectCustomFileExtension
||
fileVariables
.
some
((
item
)
=>
item
.
canSelectCustomFileExtension
),
customFileExtensionList
:
[
...(
chatConfig
?.
fileSelectConfig
?.
customFileExtensionList
??
[]),
...
fileVariables
.
flatMap
((
item
)
=>
item
.
customFileExtensionList
??
[])
]
};
};
async
function
handler
(
req
:
ApiRequestProps
):
Promise
<
CreatePostPresignedUrlResponseType
>
{
async
function
handler
(
req
:
ApiRequestProps
):
Promise
<
CreatePostPresignedUrlResponseType
>
{
const
{
const
{
...
@@ -54,7 +98,7 @@ async function handler(req: ApiRequestProps): Promise<CreatePostPresignedUrlResp
...
@@ -54,7 +98,7 @@ async function handler(req: ApiRequestProps): Promise<CreatePostPresignedUrlResp
}
}
const
{
chatConfig
}
=
await
getAppLatestVersion
(
authRes
.
sourceId
,
app
);
const
{
chatConfig
}
=
await
getAppLatestVersion
(
authRes
.
sourceId
,
app
);
return
chatConfig
.
fileSelectConfig
;
return
getPublishedFileSelectConfig
({
chatConfig
})
;
}
}
if
(
authRes
.
sourceType
===
ChatSourceTypeEnum
.
chatAgentHelper
)
{
if
(
authRes
.
sourceType
===
ChatSourceTypeEnum
.
chatAgentHelper
)
{
...
...
projects/app/test/pages/api/core/chat/file/presignChatFilePostUrl.test.ts
View file @
5a048432
import
{
S3ErrEnum
}
from
'@fastgpt/global/common/error/code/s3'
;
import
{
S3ErrEnum
}
from
'@fastgpt/global/common/error/code/s3'
;
import
{
AppTypeEnum
}
from
'@fastgpt/global/core/app/constants'
;
import
{
AppTypeEnum
}
from
'@fastgpt/global/core/app/constants'
;
import
{
ChatSourceTypeEnum
}
from
'@fastgpt/global/core/chat/constants'
;
import
{
ChatSourceTypeEnum
}
from
'@fastgpt/global/core/chat/constants'
;
import
{
VariableInputEnum
}
from
'@fastgpt/global/core/workflow/constants'
;
import
type
{
ApiRequestProps
}
from
'@fastgpt/next/type'
;
import
type
{
ApiRequestProps
}
from
'@fastgpt/next/type'
;
import
{
beforeEach
,
describe
,
expect
,
it
,
vi
}
from
'vitest'
;
import
{
beforeEach
,
describe
,
expect
,
it
,
vi
}
from
'vitest'
;
...
@@ -387,4 +388,35 @@ describe('presignChatFilePostUrl', () => {
...
@@ -387,4 +388,35 @@ describe('presignChatFilePostUrl', () => {
expect
(
mocks
.
createUploadChatFileURL
).
not
.
toHaveBeenCalled
();
expect
(
mocks
.
createUploadChatFileURL
).
not
.
toHaveBeenCalled
();
});
});
it
(
'allows uploads enabled by a published file variable'
,
async
()
=>
{
mocks
.
getAppLatestVersion
.
mockResolvedValueOnce
({
chatConfig
:
{
fileSelectConfig
:
{},
variables
:
[
{
type
:
VariableInputEnum
.
file
,
canSelectImg
:
true
}
]
}
});
await
expect
(
callHandler
({
filename
,
contentType
:
'image/png'
,
appId
,
chatId
})
).
resolves
.
toMatchObject
({
url
:
'https://example.com/upload-token'
});
expect
(
mocks
.
createUploadChatFileURL
).
toHaveBeenCalledWith
(
expect
.
objectContaining
({
allowedExtensions
:
expect
.
arrayContaining
([
'.jpg'
,
'.jpeg'
,
'.png'
])
})
);
});
});
});
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment