|
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} |
|
|