from flask import request from flask_login import current_user from flask_restful import Resource, marshal_with import services from configs import dify_config from constants import DOCUMENT_EXTENSIONS from controllers.common.errors import FilenameNotExistsError from controllers.console.wraps import ( account_initialization_required, cloud_edition_billing_resource_check, setup_required, ) from fields.file_fields import file_fields, upload_config_fields from libs.login import login_required from services.file_service import FileService from .errors import ( FileTooLargeError, NoFileUploadedError, TooManyFilesError, UnsupportedFileTypeError, ) PREVIEW_WORDS_LIMIT = 3000 class FileApi(Resource): @setup_required @login_required @account_initialization_required @marshal_with(upload_config_fields) def get(self): return { "file_size_limit": dify_config.UPLOAD_FILE_SIZE_LIMIT, "batch_count_limit": dify_config.UPLOAD_FILE_BATCH_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, "workflow_file_upload_limit": dify_config.WORKFLOW_FILE_UPLOAD_LIMIT, }, 200 @setup_required @login_required @account_initialization_required @marshal_with(file_fields) @cloud_edition_billing_resource_check("documents") def post(self): file = request.files["file"] source = request.form.get("source") if "file" not in request.files: raise NoFileUploadedError() if len(request.files) > 1: raise TooManyFilesError() if not file.filename: raise FilenameNotExistsError if source not in ("datasets", None): source = None try: upload_file = FileService.upload_file( filename=file.filename, content=file.read(), mimetype=file.mimetype, user=current_user, source=source, ) except services.errors.file.FileTooLargeError as file_too_large_error: raise FileTooLargeError(file_too_large_error.description) except services.errors.file.UnsupportedFileTypeError: raise UnsupportedFileTypeError() return upload_file, 201 class FilePreviewApi(Resource): @setup_required @login_required @account_initialization_required def get(self, file_id): file_id = str(file_id) text = FileService.get_file_preview(file_id) return {"content": text} class FileSupportTypeApi(Resource): @setup_required @login_required @account_initialization_required def get(self): return {"allowed_extensions": DOCUMENT_EXTENSIONS}