Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

upload.py 3.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. from mimetypes import guess_extension
  2. from flask import request
  3. from flask_restx import Resource, marshal_with
  4. from werkzeug.exceptions import Forbidden
  5. import services
  6. from controllers.common.errors import (
  7. FileTooLargeError,
  8. UnsupportedFileTypeError,
  9. )
  10. from controllers.console.wraps import setup_required
  11. from controllers.files import api
  12. from controllers.inner_api.plugin.wraps import get_user
  13. from core.file.helpers import verify_plugin_file_signature
  14. from core.tools.tool_file_manager import ToolFileManager
  15. from fields.file_fields import file_fields
  16. class PluginUploadFileApi(Resource):
  17. @setup_required
  18. @marshal_with(file_fields)
  19. def post(self):
  20. # get file from request
  21. file = request.files["file"]
  22. timestamp = request.args.get("timestamp")
  23. nonce = request.args.get("nonce")
  24. sign = request.args.get("sign")
  25. tenant_id = request.args.get("tenant_id")
  26. if not tenant_id:
  27. raise Forbidden("Invalid request.")
  28. user_id = request.args.get("user_id")
  29. user = get_user(tenant_id, user_id)
  30. filename = file.filename
  31. mimetype = file.mimetype
  32. if not filename or not mimetype:
  33. raise Forbidden("Invalid request.")
  34. if not timestamp or not nonce or not sign:
  35. raise Forbidden("Invalid request.")
  36. if not verify_plugin_file_signature(
  37. filename=filename,
  38. mimetype=mimetype,
  39. tenant_id=tenant_id,
  40. user_id=user_id,
  41. timestamp=timestamp,
  42. nonce=nonce,
  43. sign=sign,
  44. ):
  45. raise Forbidden("Invalid request.")
  46. try:
  47. tool_file = ToolFileManager().create_file_by_raw(
  48. user_id=user.id,
  49. tenant_id=tenant_id,
  50. file_binary=file.read(),
  51. mimetype=mimetype,
  52. filename=filename,
  53. conversation_id=None,
  54. )
  55. extension = guess_extension(tool_file.mimetype) or ".bin"
  56. preview_url = ToolFileManager.sign_file(tool_file_id=tool_file.id, extension=extension)
  57. # Create a dictionary with all the necessary attributes
  58. result = {
  59. "id": tool_file.id,
  60. "user_id": tool_file.user_id,
  61. "tenant_id": tool_file.tenant_id,
  62. "conversation_id": tool_file.conversation_id,
  63. "file_key": tool_file.file_key,
  64. "mimetype": tool_file.mimetype,
  65. "original_url": tool_file.original_url,
  66. "name": tool_file.name,
  67. "size": tool_file.size,
  68. "mime_type": mimetype,
  69. "extension": extension,
  70. "preview_url": preview_url,
  71. }
  72. return result, 201
  73. except services.errors.file.FileTooLargeError as file_too_large_error:
  74. raise FileTooLargeError(file_too_large_error.description)
  75. except services.errors.file.UnsupportedFileTypeError:
  76. raise UnsupportedFileTypeError()
  77. api.add_resource(PluginUploadFileApi, "/files/upload/for-plugin")