diff --git a/packages/server/src/utils/createAttachment.ts b/packages/server/src/utils/createAttachment.ts index 1746cf9c61e..022a3f82ce4 100644 --- a/packages/server/src/utils/createAttachment.ts +++ b/packages/server/src/utils/createAttachment.ts @@ -75,23 +75,40 @@ export const createFileAttachment = async (req: Request) => { usage: 'perPage', legacyBuild: false } + let allowedFileTypes: string[] = [] + let fileUploadEnabled = false if (chatflow.chatbotConfig) { try { const chatbotConfig = JSON.parse(chatflow.chatbotConfig) - if (chatbotConfig?.fullFileUpload?.pdfFile) { - if (chatbotConfig.fullFileUpload.pdfFile.usage) { - pdfConfig.usage = chatbotConfig.fullFileUpload.pdfFile.usage + if (chatbotConfig?.fullFileUpload) { + fileUploadEnabled = chatbotConfig.fullFileUpload.status + + // Get allowed file types from configuration + if (chatbotConfig.fullFileUpload.allowedUploadFileTypes) { + allowedFileTypes = chatbotConfig.fullFileUpload.allowedUploadFileTypes.split(',') } - if (chatbotConfig.fullFileUpload.pdfFile.legacyBuild !== undefined) { - pdfConfig.legacyBuild = chatbotConfig.fullFileUpload.pdfFile.legacyBuild + + // PDF specific configuration + if (chatbotConfig.fullFileUpload.pdfFile) { + if (chatbotConfig.fullFileUpload.pdfFile.usage) { + pdfConfig.usage = chatbotConfig.fullFileUpload.pdfFile.usage + } + if (chatbotConfig.fullFileUpload.pdfFile.legacyBuild !== undefined) { + pdfConfig.legacyBuild = chatbotConfig.fullFileUpload.pdfFile.legacyBuild + } } } } catch (e) { - // Use default PDF config if parsing fails + // Use default config if parsing fails } } + // Check if file upload is enabled + if (!fileUploadEnabled) { + throw new InternalFlowiseError(StatusCodes.BAD_REQUEST, 'File upload is not enabled for this chatflow') + } + // Find FileLoader node const fileLoaderComponent = appServer.nodesPool.componentNodes['fileLoader'] const fileLoaderNodeInstanceFilePath = fileLoaderComponent.filePath as string @@ -109,6 +126,21 @@ export const createFileAttachment = async (req: Request) => { if (files.length) { const isBase64 = req.body.base64 for (const file of files) { + if (!allowedFileTypes.length) { + throw new InternalFlowiseError( + StatusCodes.BAD_REQUEST, + `File type '${file.mimetype}' is not allowed. Allowed types: ${allowedFileTypes.join(', ')}` + ) + } + + // Validate file type against allowed types + if (allowedFileTypes.length > 0 && !allowedFileTypes.includes(file.mimetype)) { + throw new InternalFlowiseError( + StatusCodes.BAD_REQUEST, + `File type '${file.mimetype}' is not allowed. Allowed types: ${allowedFileTypes.join(', ')}` + ) + } + await checkStorage(orgId, subscriptionId, appServer.usageCacheManager) const fileBuffer = await getFileFromUpload(file.path ?? file.key) diff --git a/packages/ui/src/ui-component/extended/FileUpload.jsx b/packages/ui/src/ui-component/extended/FileUpload.jsx index bc1fd9962ad..d688cb75460 100644 --- a/packages/ui/src/ui-component/extended/FileUpload.jsx +++ b/packages/ui/src/ui-component/extended/FileUpload.jsx @@ -18,7 +18,7 @@ import useNotifier from '@/utils/useNotifier' // API import chatflowsApi from '@/api/chatflows' -const message = `Uploaded files will be parsed as strings and sent to the LLM. If file upload is enabled on the Vector Store as well, this will override and take precedence. +const message = `The full contents of uploaded files will be converted to text and sent to the Agent.
Refer docs for more details.`