tool_files.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. from flask import Response
  2. from flask_restful import Resource, reqparse
  3. from werkzeug.exceptions import Forbidden, NotFound
  4. from controllers.files import api
  5. from core.tools.tool_file_manager import ToolFileManager
  6. from libs.exception import BaseHTTPException
  7. class ToolFilePreviewApi(Resource):
  8. def get(self, file_id, extension):
  9. file_id = str(file_id)
  10. parser = reqparse.RequestParser()
  11. parser.add_argument("timestamp", type=str, required=True, location="args")
  12. parser.add_argument("nonce", type=str, required=True, location="args")
  13. parser.add_argument("sign", type=str, required=True, location="args")
  14. args = parser.parse_args()
  15. if not ToolFileManager.verify_file(
  16. file_id=file_id,
  17. timestamp=args["timestamp"],
  18. nonce=args["nonce"],
  19. sign=args["sign"],
  20. ):
  21. raise Forbidden("Invalid request.")
  22. try:
  23. result = ToolFileManager.get_file_generator_by_tool_file_id(
  24. file_id,
  25. )
  26. if not result:
  27. raise NotFound("file is not found")
  28. generator, mimetype = result
  29. except Exception:
  30. raise UnsupportedFileTypeError()
  31. return Response(generator, mimetype=mimetype)
  32. api.add_resource(ToolFilePreviewApi, "/files/tools/<uuid:file_id>.<string:extension>")
  33. class UnsupportedFileTypeError(BaseHTTPException):
  34. error_code = "unsupported_file_type"
  35. description = "File type not allowed."
  36. code = 415