Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

image_preview.py 3.9KB

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