Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

image_preview.py 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. from urllib.parse import quote
  2. from flask import Response, request
  3. from flask_restx import Resource, reqparse
  4. from werkzeug.exceptions import NotFound
  5. import services
  6. from controllers.common.errors import UnsupportedFileTypeError
  7. from controllers.files import files_ns
  8. from extensions.ext_database import db
  9. from services.account_service import TenantService
  10. from services.file_service import FileService
  11. @files_ns.route("/<uuid:file_id>/image-preview")
  12. class ImagePreviewApi(Resource):
  13. """
  14. Deprecated
  15. """
  16. def get(self, file_id):
  17. file_id = str(file_id)
  18. timestamp = request.args.get("timestamp")
  19. nonce = request.args.get("nonce")
  20. sign = request.args.get("sign")
  21. if not timestamp or not nonce or not sign:
  22. return {"content": "Invalid request."}, 400
  23. try:
  24. generator, mimetype = FileService(db.engine).get_image_preview(
  25. file_id=file_id,
  26. timestamp=timestamp,
  27. nonce=nonce,
  28. sign=sign,
  29. )
  30. except services.errors.file.UnsupportedFileTypeError:
  31. raise UnsupportedFileTypeError()
  32. return Response(generator, mimetype=mimetype)
  33. @files_ns.route("/<uuid:file_id>/file-preview")
  34. class FilePreviewApi(Resource):
  35. def get(self, file_id):
  36. file_id = str(file_id)
  37. parser = reqparse.RequestParser()
  38. parser.add_argument("timestamp", type=str, required=True, location="args")
  39. parser.add_argument("nonce", type=str, required=True, location="args")
  40. parser.add_argument("sign", type=str, required=True, location="args")
  41. parser.add_argument("as_attachment", type=bool, required=False, default=False, location="args")
  42. args = parser.parse_args()
  43. if not args["timestamp"] or not args["nonce"] or not args["sign"]:
  44. return {"content": "Invalid request."}, 400
  45. try:
  46. generator, upload_file = FileService(db.engine).get_file_generator_by_file_id(
  47. file_id=file_id,
  48. timestamp=args["timestamp"],
  49. nonce=args["nonce"],
  50. sign=args["sign"],
  51. )
  52. except services.errors.file.UnsupportedFileTypeError:
  53. raise UnsupportedFileTypeError()
  54. response = Response(
  55. generator,
  56. mimetype=upload_file.mime_type,
  57. direct_passthrough=True,
  58. headers={},
  59. )
  60. # add Accept-Ranges header for audio/video files
  61. if upload_file.mime_type in [
  62. "audio/mpeg",
  63. "audio/wav",
  64. "audio/mp4",
  65. "audio/ogg",
  66. "audio/flac",
  67. "audio/aac",
  68. "video/mp4",
  69. "video/webm",
  70. "video/quicktime",
  71. "audio/x-m4a",
  72. ]:
  73. response.headers["Accept-Ranges"] = "bytes"
  74. if upload_file.size > 0:
  75. response.headers["Content-Length"] = str(upload_file.size)
  76. if args["as_attachment"]:
  77. encoded_filename = quote(upload_file.name)
  78. response.headers["Content-Disposition"] = f"attachment; filename*=UTF-8''{encoded_filename}"
  79. response.headers["Content-Type"] = "application/octet-stream"
  80. return response
  81. @files_ns.route("/workspaces/<uuid:workspace_id>/webapp-logo")
  82. class WorkspaceWebappLogoApi(Resource):
  83. def get(self, workspace_id):
  84. workspace_id = str(workspace_id)
  85. custom_config = TenantService.get_custom_config(workspace_id)
  86. webapp_logo_file_id = custom_config.get("replace_webapp_logo") if custom_config is not None else None
  87. if not webapp_logo_file_id:
  88. raise NotFound("webapp logo is not found")
  89. try:
  90. generator, mimetype = FileService(db.engine).get_public_image_preview(
  91. webapp_logo_file_id,
  92. )
  93. except services.errors.file.UnsupportedFileTypeError:
  94. raise UnsupportedFileTypeError()
  95. return Response(generator, mimetype=mimetype)