You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

file.py 1.6KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. from flask import request
  2. from flask_restx import Resource, marshal_with
  3. import services
  4. from controllers.common.errors import (
  5. FilenameNotExistsError,
  6. FileTooLargeError,
  7. NoFileUploadedError,
  8. TooManyFilesError,
  9. UnsupportedFileTypeError,
  10. )
  11. from controllers.service_api import api
  12. from controllers.service_api.wraps import FetchUserArg, WhereisUserArg, validate_app_token
  13. from fields.file_fields import file_fields
  14. from models.model import App, EndUser
  15. from services.file_service import FileService
  16. class FileApi(Resource):
  17. @validate_app_token(fetch_user_arg=FetchUserArg(fetch_from=WhereisUserArg.FORM))
  18. @marshal_with(file_fields)
  19. def post(self, app_model: App, end_user: EndUser):
  20. # check file
  21. if "file" not in request.files:
  22. raise NoFileUploadedError()
  23. if len(request.files) > 1:
  24. raise TooManyFilesError()
  25. file = request.files["file"]
  26. if not file.mimetype:
  27. raise UnsupportedFileTypeError()
  28. if not file.filename:
  29. raise FilenameNotExistsError
  30. try:
  31. upload_file = FileService.upload_file(
  32. filename=file.filename,
  33. content=file.read(),
  34. mimetype=file.mimetype,
  35. user=end_user,
  36. )
  37. except services.errors.file.FileTooLargeError as file_too_large_error:
  38. raise FileTooLargeError(file_too_large_error.description)
  39. except services.errors.file.UnsupportedFileTypeError:
  40. raise UnsupportedFileTypeError()
  41. return upload_file, 201
  42. api.add_resource(FileApi, "/files/upload")