Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

file.py 2.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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 fields.file_fields import build_file_model
  15. from models.model import App, EndUser
  16. from services.file_service import FileService
  17. @service_api_ns.route("/files/upload")
  18. class FileApi(Resource):
  19. @service_api_ns.doc("upload_file")
  20. @service_api_ns.doc(description="Upload a file for use in conversations")
  21. @service_api_ns.doc(
  22. responses={
  23. 201: "File uploaded successfully",
  24. 400: "Bad request - no file or invalid file",
  25. 401: "Unauthorized - invalid API token",
  26. 413: "File too large",
  27. 415: "Unsupported file type",
  28. }
  29. )
  30. @validate_app_token(fetch_user_arg=FetchUserArg(fetch_from=WhereisUserArg.FORM))
  31. @service_api_ns.marshal_with(build_file_model(service_api_ns), code=HTTPStatus.CREATED)
  32. def post(self, app_model: App, end_user: EndUser):
  33. """Upload a file for use in conversations.
  34. Accepts a single file upload via multipart/form-data.
  35. """
  36. # check file
  37. if "file" not in request.files:
  38. raise NoFileUploadedError()
  39. if len(request.files) > 1:
  40. raise TooManyFilesError()
  41. file = request.files["file"]
  42. if not file.mimetype:
  43. raise UnsupportedFileTypeError()
  44. if not file.filename:
  45. raise FilenameNotExistsError
  46. try:
  47. upload_file = FileService.upload_file(
  48. filename=file.filename,
  49. content=file.read(),
  50. mimetype=file.mimetype,
  51. user=end_user,
  52. )
  53. except services.errors.file.FileTooLargeError as file_too_large_error:
  54. raise FileTooLargeError(file_too_large_error.description)
  55. except services.errors.file.UnsupportedFileTypeError:
  56. raise UnsupportedFileTypeError()
  57. return upload_file, 201