您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

upload.py 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. from mimetypes import guess_extension
  2. from flask import request
  3. from flask_restful import Resource, marshal_with # type: ignore
  4. from werkzeug.exceptions import Forbidden
  5. import services
  6. from controllers.console.wraps import setup_required
  7. from controllers.files import api
  8. from controllers.files.error import UnsupportedFileTypeError
  9. from controllers.inner_api.plugin.wraps import get_user
  10. from controllers.service_api.app.error import FileTooLargeError
  11. from core.file.helpers import verify_plugin_file_signature
  12. from core.tools.tool_file_manager import ToolFileManager
  13. from fields.file_fields import file_fields
  14. class PluginUploadFileApi(Resource):
  15. @setup_required
  16. @marshal_with(file_fields)
  17. def post(self):
  18. # get file from request
  19. file = request.files["file"]
  20. timestamp = request.args.get("timestamp")
  21. nonce = request.args.get("nonce")
  22. sign = request.args.get("sign")
  23. tenant_id = request.args.get("tenant_id")
  24. if not tenant_id:
  25. raise Forbidden("Invalid request.")
  26. user_id = request.args.get("user_id")
  27. user = get_user(tenant_id, user_id)
  28. filename = file.filename
  29. mimetype = file.mimetype
  30. if not filename or not mimetype:
  31. raise Forbidden("Invalid request.")
  32. if not timestamp or not nonce or not sign:
  33. raise Forbidden("Invalid request.")
  34. if not verify_plugin_file_signature(
  35. filename=filename,
  36. mimetype=mimetype,
  37. tenant_id=tenant_id,
  38. user_id=user_id,
  39. timestamp=timestamp,
  40. nonce=nonce,
  41. sign=sign,
  42. ):
  43. raise Forbidden("Invalid request.")
  44. try:
  45. tool_file = ToolFileManager.create_file_by_raw(
  46. user_id=user.id,
  47. tenant_id=tenant_id,
  48. file_binary=file.read(),
  49. mimetype=mimetype,
  50. filename=filename,
  51. conversation_id=None,
  52. )
  53. extension = guess_extension(tool_file.mimetype) or ".bin"
  54. preview_url = ToolFileManager.sign_file(tool_file_id=tool_file.id, extension=extension)
  55. tool_file.mime_type = mimetype
  56. tool_file.extension = extension
  57. tool_file.preview_url = preview_url
  58. except services.errors.file.FileTooLargeError as file_too_large_error:
  59. raise FileTooLargeError(file_too_large_error.description)
  60. except services.errors.file.UnsupportedFileTypeError:
  61. raise UnsupportedFileTypeError()
  62. return tool_file, 201
  63. api.add_resource(PluginUploadFileApi, "/files/upload/for-plugin")