浏览代码

feat(file-upload): add support for optional file source parameter (#9554)

tags/0.10.0
-LAN- 1年前
父节点
当前提交
8d8a8fe295
没有帐户链接到提交者的电子邮件
共有 3 个文件被更改,包括 23 次插入10 次删除
  1. 6
    2
      api/controllers/console/datasets/file.py
  2. 6
    2
      api/controllers/web/file.py
  3. 11
    6
      api/services/file_service.py

+ 6
- 2
api/controllers/console/datasets/file.py 查看文件



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:

+ 6
- 2
api/controllers/web/file.py 查看文件

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:

+ 11
- 6
api/services/file_service.py 查看文件

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

正在加载...
取消
保存