| from flask import request | from flask import request | ||||
| from flask_login import current_user | from flask_login import current_user | ||||
| from flask_restful import Resource, marshal_with | |||||
| from flask_restful import Resource, marshal_with, reqparse | |||||
| import services | import services | ||||
| from configs import dify_config | from configs import dify_config | ||||
| # get file from request | # get file from request | ||||
| file = request.files["file"] | file = request.files["file"] | ||||
| parser = reqparse.RequestParser() | |||||
| parser.add_argument("source", type=str, required=False, location="args") | |||||
| source = parser.parse_args().get("source") | |||||
| # check file | # check file | ||||
| if "file" not in request.files: | if "file" not in request.files: | ||||
| raise NoFileUploadedError() | raise NoFileUploadedError() | ||||
| if len(request.files) > 1: | if len(request.files) > 1: | ||||
| raise TooManyFilesError() | raise TooManyFilesError() | ||||
| try: | try: | ||||
| upload_file = FileService.upload_file(file=file, user=current_user) | |||||
| upload_file = FileService.upload_file(file=file, user=current_user, source=source) | |||||
| except services.errors.file.FileTooLargeError as file_too_large_error: | except services.errors.file.FileTooLargeError as file_too_large_error: | ||||
| raise FileTooLargeError(file_too_large_error.description) | raise FileTooLargeError(file_too_large_error.description) | ||||
| except services.errors.file.UnsupportedFileTypeError: | except services.errors.file.UnsupportedFileTypeError: |
| import urllib.parse | import urllib.parse | ||||
| from flask import request | from flask import request | ||||
| from flask_restful import marshal_with | |||||
| from flask_restful import marshal_with, reqparse | |||||
| import services | import services | ||||
| from controllers.web import api | from controllers.web import api | ||||
| # get file from request | # get file from request | ||||
| file = request.files["file"] | file = request.files["file"] | ||||
| parser = reqparse.RequestParser() | |||||
| parser.add_argument("source", type=str, required=False, location="args") | |||||
| source = parser.parse_args().get("source") | |||||
| # check file | # check file | ||||
| if "file" not in request.files: | if "file" not in request.files: | ||||
| raise NoFileUploadedError() | raise NoFileUploadedError() | ||||
| if len(request.files) > 1: | if len(request.files) > 1: | ||||
| raise TooManyFilesError() | raise TooManyFilesError() | ||||
| try: | try: | ||||
| upload_file = FileService.upload_file(file, end_user) | |||||
| upload_file = FileService.upload_file(file=file, user=end_user, source=source) | |||||
| except services.errors.file.FileTooLargeError as file_too_large_error: | except services.errors.file.FileTooLargeError as file_too_large_error: | ||||
| raise FileTooLargeError(file_too_large_error.description) | raise FileTooLargeError(file_too_large_error.description) | ||||
| except services.errors.file.UnsupportedFileTypeError: | except services.errors.file.UnsupportedFileTypeError: |
| import hashlib | import hashlib | ||||
| import uuid | import uuid | ||||
| from collections.abc import Generator | from collections.abc import Generator | ||||
| from typing import Union | |||||
| from typing import Literal, Union | |||||
| from flask_login import current_user | from flask_login import current_user | ||||
| from werkzeug.datastructures import FileStorage | from werkzeug.datastructures import FileStorage | ||||
| class FileService: | class FileService: | ||||
| @staticmethod | @staticmethod | ||||
| def upload_file(file: FileStorage, user: Union[Account, EndUser]) -> UploadFile: | |||||
| def upload_file( | |||||
| file: FileStorage, user: Union[Account, EndUser], source: Literal["datasets"] | None = None | |||||
| ) -> UploadFile: | |||||
| # get file name | # get file name | ||||
| filename = file.filename | filename = file.filename | ||||
| if not filename: | if not filename: | ||||
| extension = filename.split(".")[-1] | extension = filename.split(".")[-1] | ||||
| if len(filename) > 200: | if len(filename) > 200: | ||||
| filename = filename.split(".")[0][:200] + "." + extension | filename = filename.split(".")[0][:200] + "." + extension | ||||
| # read file content | |||||
| file_content = file.read() | |||||
| # get file size | |||||
| file_size = len(file_content) | |||||
| if source == "datasets" and extension not in DOCUMENT_EXTENSIONS: | |||||
| raise UnsupportedFileTypeError() | |||||
| # select file size limit | # select file size limit | ||||
| if extension in IMAGE_EXTENSIONS: | if extension in IMAGE_EXTENSIONS: | ||||
| else: | else: | ||||
| file_size_limit = dify_config.UPLOAD_FILE_SIZE_LIMIT * 1024 * 1024 | file_size_limit = dify_config.UPLOAD_FILE_SIZE_LIMIT * 1024 * 1024 | ||||
| # read file content | |||||
| file_content = file.read() | |||||
| # get file size | |||||
| file_size = len(file_content) | |||||
| # check if the file size is exceeded | # check if the file size is exceeded | ||||
| if file_size > file_size_limit: | if file_size > file_size_limit: | ||||
| message = f"File size exceeded. {file_size} > {file_size_limit}" | message = f"File size exceeded. {file_size} > {file_size_limit}" |