file.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. from flask import request
  2. from flask_restful import Resource, marshal_with
  3. import services
  4. from controllers.common.errors import FilenameNotExistsError
  5. from controllers.service_api import api
  6. from controllers.service_api.app.error import (
  7. FileTooLargeError,
  8. NoFileUploadedError,
  9. TooManyFilesError,
  10. UnsupportedFileTypeError,
  11. )
  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. file = request.files["file"]
  21. # check file
  22. if "file" not in request.files:
  23. raise NoFileUploadedError()
  24. if not file.mimetype:
  25. raise UnsupportedFileTypeError()
  26. if len(request.files) > 1:
  27. raise TooManyFilesError()
  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")