image_preview.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. from urllib.parse import quote
  2. from flask import Response, request
  3. from flask_restful import Resource, reqparse # type: ignore
  4. from werkzeug.exceptions import NotFound
  5. import services
  6. from controllers.files import api
  7. from controllers.files.error import UnsupportedFileTypeError
  8. from services.account_service import TenantService
  9. from services.file_service import FileService
  10. class ImagePreviewApi(Resource):
  11. """
  12. Deprecated
  13. """
  14. def get(self, file_id):
  15. file_id = str(file_id)
  16. timestamp = request.args.get("timestamp")
  17. nonce = request.args.get("nonce")
  18. sign = request.args.get("sign")
  19. if not timestamp or not nonce or not sign:
  20. return {"content": "Invalid request."}, 400
  21. try:
  22. generator, mimetype = FileService.get_image_preview(
  23. file_id=file_id,
  24. timestamp=timestamp,
  25. nonce=nonce,
  26. sign=sign,
  27. )
  28. except services.errors.file.UnsupportedFileTypeError:
  29. raise UnsupportedFileTypeError()
  30. return Response(generator, mimetype=mimetype)
  31. class FilePreviewApi(Resource):
  32. def get(self, file_id):
  33. file_id = str(file_id)
  34. parser = reqparse.RequestParser()
  35. parser.add_argument("timestamp", type=str, required=True, location="args")
  36. parser.add_argument("nonce", type=str, required=True, location="args")
  37. parser.add_argument("sign", type=str, required=True, location="args")
  38. parser.add_argument("as_attachment", type=bool, required=False, default=False, location="args")
  39. args = parser.parse_args()
  40. if not args["timestamp"] or not args["nonce"] or not args["sign"]:
  41. return {"content": "Invalid request."}, 400
  42. try:
  43. generator, upload_file = FileService.get_file_generator_by_file_id(
  44. file_id=file_id,
  45. timestamp=args["timestamp"],
  46. nonce=args["nonce"],
  47. sign=args["sign"],
  48. )
  49. except services.errors.file.UnsupportedFileTypeError:
  50. raise UnsupportedFileTypeError()
  51. response = Response(
  52. generator,
  53. mimetype=upload_file.mime_type,
  54. direct_passthrough=True,
  55. headers={},
  56. )
  57. if upload_file.size > 0:
  58. response.headers["Content-Length"] = str(upload_file.size)
  59. if args["as_attachment"]:
  60. encoded_filename = quote(upload_file.name)
  61. response.headers["Content-Disposition"] = f"attachment; filename*=UTF-8''{encoded_filename}"
  62. response.headers["Content-Type"] = "application/octet-stream"
  63. return response
  64. class WorkspaceWebappLogoApi(Resource):
  65. def get(self, workspace_id):
  66. workspace_id = str(workspace_id)
  67. custom_config = TenantService.get_custom_config(workspace_id)
  68. webapp_logo_file_id = custom_config.get("replace_webapp_logo") if custom_config is not None else None
  69. if not webapp_logo_file_id:
  70. raise NotFound("webapp logo is not found")
  71. try:
  72. generator, mimetype = FileService.get_public_image_preview(
  73. webapp_logo_file_id,
  74. )
  75. except services.errors.file.UnsupportedFileTypeError:
  76. raise UnsupportedFileTypeError()
  77. return Response(generator, mimetype=mimetype)
  78. api.add_resource(ImagePreviewApi, "/files/<uuid:file_id>/image-preview")
  79. api.add_resource(FilePreviewApi, "/files/<uuid:file_id>/file-preview")
  80. api.add_resource(WorkspaceWebappLogoApi, "/files/workspaces/<uuid:workspace_id>/webapp-logo")