You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

upload.py 3.1KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. from mimetypes import guess_extension
  2. from flask import request
  3. from flask_restful import Resource, marshal_with
  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. # Create a dictionary with all the necessary attributes
  56. result = {
  57. "id": tool_file.id,
  58. "user_id": tool_file.user_id,
  59. "tenant_id": tool_file.tenant_id,
  60. "conversation_id": tool_file.conversation_id,
  61. "file_key": tool_file.file_key,
  62. "mimetype": tool_file.mimetype,
  63. "original_url": tool_file.original_url,
  64. "name": tool_file.name,
  65. "size": tool_file.size,
  66. "mime_type": mimetype,
  67. "extension": extension,
  68. "preview_url": preview_url,
  69. }
  70. return result, 201
  71. except services.errors.file.FileTooLargeError as file_too_large_error:
  72. raise FileTooLargeError(file_too_large_error.description)
  73. except services.errors.file.UnsupportedFileTypeError:
  74. raise UnsupportedFileTypeError()
  75. api.add_resource(PluginUploadFileApi, "/files/upload/for-plugin")