tool_files.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  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(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('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