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

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. from flask import request
  2. from flask_restx import 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.web import web_ns
  12. from controllers.web.wraps import WebApiResource
  13. from fields.file_fields import build_file_model
  14. from services.file_service import FileService
  15. @web_ns.route("/files/upload")
  16. class FileApi(WebApiResource):
  17. @web_ns.doc("upload_file")
  18. @web_ns.doc(description="Upload a file for use in web applications")
  19. @web_ns.doc(
  20. responses={
  21. 201: "File uploaded successfully",
  22. 400: "Bad request - invalid file or parameters",
  23. 413: "File too large",
  24. 415: "Unsupported file type",
  25. }
  26. )
  27. @marshal_with(build_file_model(web_ns))
  28. def post(self, app_model, end_user):
  29. """Upload a file for use in web applications.
  30. Accepts file uploads for use within web applications, supporting
  31. multiple file types with automatic validation and storage.
  32. Args:
  33. app_model: The associated application model
  34. end_user: The end user uploading the file
  35. Form Parameters:
  36. file: The file to upload (required)
  37. source: Optional source type (datasets or None)
  38. Returns:
  39. dict: File information including ID, URL, and metadata
  40. int: HTTP status code 201 for success
  41. Raises:
  42. NoFileUploadedError: No file provided in request
  43. TooManyFilesError: Multiple files provided (only one allowed)
  44. FilenameNotExistsError: File has no filename
  45. FileTooLargeError: File exceeds size limit
  46. UnsupportedFileTypeError: File type not supported
  47. """
  48. if "file" not in request.files:
  49. raise NoFileUploadedError()
  50. if len(request.files) > 1:
  51. raise TooManyFilesError()
  52. file = request.files["file"]
  53. if not file.filename:
  54. raise FilenameNotExistsError
  55. source = request.form.get("source")
  56. if source not in ("datasets", None):
  57. source = None
  58. try:
  59. upload_file = FileService.upload_file(
  60. filename=file.filename,
  61. content=file.read(),
  62. mimetype=file.mimetype,
  63. user=end_user,
  64. source="datasets" if source == "datasets" else None,
  65. )
  66. except services.errors.file.FileTooLargeError as file_too_large_error:
  67. raise FileTooLargeError(file_too_large_error.description)
  68. except services.errors.file.UnsupportedFileTypeError:
  69. raise UnsupportedFileTypeError()
  70. return upload_file, 201