upload.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import base64
  2. import traceback
  3. from typing import Callable, Optional
  4. import justpy as jp
  5. from ..events import UploadEventArguments, handle_event
  6. from .element import Element
  7. class Upload(Element):
  8. def __init__(self, *,
  9. multiple: bool = False,
  10. on_upload: Optional[Callable] = None,
  11. upload_button_text: str = 'Upload') -> None:
  12. """File Upload
  13. :param multiple: allow uploading multiple files at once (default: `False`)
  14. :param on_upload: callback to execute when a file is uploaded (list of bytearrays)
  15. :param upload_button_text: text for the upload button
  16. """
  17. self.upload_handler = on_upload
  18. view = jp.Form(
  19. enctype='multipart/form-data',
  20. classes='flex gap-4 items-center',
  21. submit=lambda sender, msg: self.submit(sender, msg),
  22. temp=False,
  23. )
  24. jp.Input(type='file', multiple=multiple, change=lambda *_: False, a=view, temp=False)
  25. jp.QBtn(type='submit', text=upload_button_text, color='primary', a=view, temp=False)
  26. super().__init__(view)
  27. def submit(self, _, msg) -> Optional[bool]:
  28. try:
  29. page_update = False
  30. for form_data in msg.form_data:
  31. if form_data.type == 'file':
  32. files = [base64.b64decode(f.file_content) for f in form_data.files]
  33. names = [f.name for f in form_data.files]
  34. arguments = UploadEventArguments(sender=self, socket=msg.websocket, files=files, names=names)
  35. if handle_event(self.upload_handler, arguments):
  36. page_update = None
  37. return page_update
  38. except Exception:
  39. traceback.print_exc()