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

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