From 48db4ab27137afc3d012ef36175d9fb376fcb5ea Mon Sep 17 00:00:00 2001 From: JzoNg Date: Fri, 24 Oct 2025 16:14:50 +0800 Subject: [PATCH 1/3] fix: upload limit in knowledge --- .../datasets/create/file-uploader/index.tsx | 19 +++++++++++-------- web/i18n/en-US/dataset-creation.ts | 2 +- web/i18n/zh-Hans/dataset-creation.ts | 2 +- web/models/common.ts | 1 + 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/web/app/components/datasets/create/file-uploader/index.tsx b/web/app/components/datasets/create/file-uploader/index.tsx index e2bbad2776..a5165d74d4 100644 --- a/web/app/components/datasets/create/file-uploader/index.tsx +++ b/web/app/components/datasets/create/file-uploader/index.tsx @@ -19,8 +19,6 @@ import { IS_CE_EDITION } from '@/config' import { Theme } from '@/types/app' import useTheme from '@/hooks/use-theme' -const FILES_NUMBER_LIMIT = 20 - type IFileUploaderProps = { fileList: FileItem[] titleClassName?: string @@ -72,6 +70,7 @@ const FileUploader = ({ const fileUploadConfig = useMemo(() => fileUploadConfigResponse ?? { file_size_limit: 15, batch_count_limit: 5, + batch_upload_limit: 5, }, [fileUploadConfigResponse]) const fileListRef = useRef([]) @@ -121,10 +120,10 @@ const FileUploader = ({ data: formData, onprogress: onProgress, }, false, undefined, '?source=datasets') - .then((res: File) => { + .then((res) => { const completeFile = { fileID: fileItem.fileID, - file: res, + file: res as unknown as File, progress: -1, } const index = fileListRef.current.findIndex(item => item.fileID === fileItem.fileID) @@ -163,11 +162,12 @@ const FileUploader = ({ }, [fileUploadConfig, uploadBatchFiles]) const initialUpload = useCallback((files: File[]) => { + const filesCountLimit = fileUploadConfig.batch_upload_limit if (!files.length) return false - if (files.length + fileList.length > FILES_NUMBER_LIMIT && !IS_CE_EDITION) { - notify({ type: 'error', message: t('datasetCreation.stepOne.uploader.validation.filesNumber', { filesNumber: FILES_NUMBER_LIMIT }) }) + if (files.length + fileList.length > filesCountLimit && !IS_CE_EDITION) { + notify({ type: 'error', message: t('datasetCreation.stepOne.uploader.validation.filesNumber', { filesNumber: filesCountLimit }) }) return false } @@ -255,10 +255,11 @@ const FileUploader = ({ ) let files = nested.flat() if (notSupportBatchUpload) files = files.slice(0, 1) + files = files.slice(0, fileUploadConfig.batch_count_limit) const valid = files.filter(isValid) initialUpload(valid) }, - [initialUpload, isValid, notSupportBatchUpload, traverseFileEntry], + [initialUpload, isValid, notSupportBatchUpload, traverseFileEntry, fileUploadConfig], ) const selectHandle = () => { if (fileUploader.current) @@ -273,7 +274,8 @@ const FileUploader = ({ onFileListUpdate?.([...fileListRef.current]) } const fileChangeHandle = useCallback((e: React.ChangeEvent) => { - const files = [...(e.target.files ?? [])] as File[] + let files = [...(e.target.files ?? [])] as File[] + files = files.slice(0, fileUploadConfig.batch_count_limit) initialUpload(files.filter(isValid)) }, [isValid, initialUpload]) @@ -325,6 +327,7 @@ const FileUploader = ({ size: fileUploadConfig.file_size_limit, supportTypes: supportTypesShowNames, batchCount: fileUploadConfig.batch_count_limit, + totalCount: fileUploadConfig.batch_upload_limit, })} {dragging &&
}
diff --git a/web/i18n/en-US/dataset-creation.ts b/web/i18n/en-US/dataset-creation.ts index 54d5a54fb4..f32639a6b4 100644 --- a/web/i18n/en-US/dataset-creation.ts +++ b/web/i18n/en-US/dataset-creation.ts @@ -38,7 +38,7 @@ const translation = { button: 'Drag and drop file or folder, or', buttonSingleFile: 'Drag and drop file, or', browse: 'Browse', - tip: 'Supports {{supportTypes}}. Max {{batchCount}} in a batch and {{size}} MB each.', + tip: 'Supports {{supportTypes}}. Max {{batchCount}} in a batch and {{size}} MB each. Max total {{totalCount}} files.', validation: { typeError: 'File type not supported', size: 'File too large. Maximum is {{size}}MB', diff --git a/web/i18n/zh-Hans/dataset-creation.ts b/web/i18n/zh-Hans/dataset-creation.ts index 5b1ff2435c..f780269914 100644 --- a/web/i18n/zh-Hans/dataset-creation.ts +++ b/web/i18n/zh-Hans/dataset-creation.ts @@ -38,7 +38,7 @@ const translation = { button: '拖拽文件或文件夹至此,或者', buttonSingleFile: '拖拽文件至此,或者', browse: '选择文件', - tip: '已支持 {{supportTypes}},每批最多 {{batchCount}} 个文件,每个文件不超过 {{size}} MB。', + tip: '已支持 {{supportTypes}},每批最多 {{batchCount}} 个文件,每个文件不超过 {{size}} MB ,总数不超过 {{totalCount}} 个文件。', validation: { typeError: '文件类型不支持', size: '文件太大了,不能超过 {{size}}MB', diff --git a/web/models/common.ts b/web/models/common.ts index aa6372e36f..d958dfa585 100644 --- a/web/models/common.ts +++ b/web/models/common.ts @@ -236,6 +236,7 @@ export type FileUploadConfigResponse = { audio_file_size_limit?: number // default is 50MB video_file_size_limit?: number // default is 100MB workflow_file_upload_limit?: number // default is 10 + batch_upload_limit: number // default is 5 } export type InvitationResult = { From 7551d14256b0425d3e73972d288a5e293cade9da Mon Sep 17 00:00:00 2001 From: jyong <718720800@qq.com> Date: Fri, 24 Oct 2025 16:25:05 +0800 Subject: [PATCH 2/3] add file_upload_limit --- api/controllers/console/files.py | 1 + 1 file changed, 1 insertion(+) diff --git a/api/controllers/console/files.py b/api/controllers/console/files.py index 1cd193f7ad..36fcd460bb 100644 --- a/api/controllers/console/files.py +++ b/api/controllers/console/files.py @@ -39,6 +39,7 @@ class FileApi(Resource): return { "file_size_limit": dify_config.UPLOAD_FILE_SIZE_LIMIT, "batch_count_limit": dify_config.UPLOAD_FILE_BATCH_LIMIT, + "file_upload_limit": dify_config.BATCH_UPLOAD_LIMIT, "image_file_size_limit": dify_config.UPLOAD_IMAGE_FILE_SIZE_LIMIT, "video_file_size_limit": dify_config.UPLOAD_VIDEO_FILE_SIZE_LIMIT, "audio_file_size_limit": dify_config.UPLOAD_AUDIO_FILE_SIZE_LIMIT, From 24fbbbb07b02d629f9a67e3ed899bf8235c124df Mon Sep 17 00:00:00 2001 From: JzoNg Date: Fri, 24 Oct 2025 16:27:17 +0800 Subject: [PATCH 3/3] use file_upload_limit --- web/app/components/datasets/create/file-uploader/index.tsx | 6 +++--- web/models/common.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/web/app/components/datasets/create/file-uploader/index.tsx b/web/app/components/datasets/create/file-uploader/index.tsx index a5165d74d4..a03e40e609 100644 --- a/web/app/components/datasets/create/file-uploader/index.tsx +++ b/web/app/components/datasets/create/file-uploader/index.tsx @@ -70,7 +70,7 @@ const FileUploader = ({ const fileUploadConfig = useMemo(() => fileUploadConfigResponse ?? { file_size_limit: 15, batch_count_limit: 5, - batch_upload_limit: 5, + file_upload_limit: 5, }, [fileUploadConfigResponse]) const fileListRef = useRef([]) @@ -162,7 +162,7 @@ const FileUploader = ({ }, [fileUploadConfig, uploadBatchFiles]) const initialUpload = useCallback((files: File[]) => { - const filesCountLimit = fileUploadConfig.batch_upload_limit + const filesCountLimit = fileUploadConfig.file_upload_limit if (!files.length) return false @@ -327,7 +327,7 @@ const FileUploader = ({ size: fileUploadConfig.file_size_limit, supportTypes: supportTypesShowNames, batchCount: fileUploadConfig.batch_count_limit, - totalCount: fileUploadConfig.batch_upload_limit, + totalCount: fileUploadConfig.file_upload_limit, })} {dragging &&
}
diff --git a/web/models/common.ts b/web/models/common.ts index d958dfa585..d83ae5fb98 100644 --- a/web/models/common.ts +++ b/web/models/common.ts @@ -236,7 +236,7 @@ export type FileUploadConfigResponse = { audio_file_size_limit?: number // default is 50MB video_file_size_limit?: number // default is 100MB workflow_file_upload_limit?: number // default is 10 - batch_upload_limit: number // default is 5 + file_upload_limit: number // default is 5 } export type InvitationResult = {