tool_files.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. from controllers.files import api
  2. from flask import Response
  3. from flask_restful import Resource, reqparse
  4. from libs.exception import BaseHTTPException
  5. from werkzeug.exceptions import NotFound, Forbidden
  6. from core.tools.tool_file_manager import ToolFileManager
  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(file_id=file_id,
  16. timestamp=args['timestamp'],
  17. nonce=args['nonce'],
  18. sign=args['sign'],
  19. ):
  20. raise Forbidden('Invalid request.')
  21. try:
  22. result = ToolFileManager.get_file_generator_by_message_file_id(
  23. file_id,
  24. )
  25. if not result:
  26. raise NotFound(f'file is not found')
  27. generator, mimetype = result
  28. except Exception:
  29. raise UnsupportedFileTypeError()
  30. return Response(generator, mimetype=mimetype)
  31. api.add_resource(ToolFilePreviewApi, '/files/tools/<uuid:file_id>.<string:extension>')
  32. class UnsupportedFileTypeError(BaseHTTPException):
  33. error_code = 'unsupported_file_type'
  34. description = "File type not allowed."
  35. code = 415