Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

2 місяці тому
2 місяці тому
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. from flask import request
  2. from flask_restx import Resource
  3. from flask_restx.api import HTTPStatus
  4. import services
  5. from controllers.common.errors import (
  6. FilenameNotExistsError,
  7. FileTooLargeError,
  8. NoFileUploadedError,
  9. TooManyFilesError,
  10. UnsupportedFileTypeError,
  11. )
  12. from controllers.service_api import service_api_ns
  13. from controllers.service_api.wraps import FetchUserArg, WhereisUserArg, validate_app_token
  14. from extensions.ext_database import db
  15. from fields.file_fields import build_file_model
  16. from models import App, EndUser
  17. from services.file_service import FileService
  18. @service_api_ns.route("/files/upload")
  19. class FileApi(Resource):
  20. @service_api_ns.doc("upload_file")
  21. @service_api_ns.doc(description="Upload a file for use in conversations")
  22. @service_api_ns.doc(
  23. responses={
  24. 201: "File uploaded successfully",
  25. 400: "Bad request - no file or invalid file",
  26. 401: "Unauthorized - invalid API token",
  27. 413: "File too large",
  28. 415: "Unsupported file type",
  29. }
  30. )
  31. @validate_app_token(fetch_user_arg=FetchUserArg(fetch_from=WhereisUserArg.FORM))
  32. @service_api_ns.marshal_with(build_file_model(service_api_ns), code=HTTPStatus.CREATED)
  33. def post(self, app_model: App, end_user: EndUser):
  34. """Upload a file for use in conversations.
  35. Accepts a single file upload via multipart/form-data.
  36. """
  37. # check file
  38. if "file" not in request.files:
  39. raise NoFileUploadedError()
  40. if len(request.files) > 1:
  41. raise TooManyFilesError()
  42. file = request.files["file"]
  43. if not file.mimetype:
  44. raise UnsupportedFileTypeError()
  45. if not file.filename:
  46. raise FilenameNotExistsError
  47. try:
  48. upload_file = FileService(db.engine).upload_file(
  49. filename=file.filename,
  50. content=file.read(),
  51. mimetype=file.mimetype,
  52. user=end_user,
  53. )
  54. except services.errors.file.FileTooLargeError as file_too_large_error:
  55. raise FileTooLargeError(file_too_large_error.description)
  56. except services.errors.file.UnsupportedFileTypeError:
  57. raise UnsupportedFileTypeError()
  58. return upload_file, 201