1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- import base64
- import traceback
- from typing import Callable, Optional
- import justpy as jp
- from ..events import UploadEventArguments, handle_event
- from .element import Element
- class Upload(Element):
- def __init__(self, *,
- multiple: bool = False,
- on_upload: Optional[Callable] = None,
- upload_button_text: str = 'Upload') -> None:
- """File Upload
- :param multiple: allow uploading multiple files at once (default: `False`)
- :param on_upload: callback to execute when a file is uploaded (list of bytearrays)
- :param upload_button_text: text for the upload button
- """
- self.upload_handler = on_upload
- view = jp.Form(
- enctype='multipart/form-data',
- classes='flex gap-4 items-center',
- submit=lambda sender, msg: self.submit(sender, msg),
- temp=False,
- )
- jp.Input(type='file', multiple=multiple, change=lambda *_: False, a=view, temp=False)
- jp.QBtn(type='submit', text=upload_button_text, color='primary', a=view, temp=False)
- super().__init__(view)
- def submit(self, _, msg) -> Optional[bool]:
- try:
- page_update = False
- for form_data in msg.form_data:
- if form_data.type == 'file':
- files = [base64.b64decode(f.file_content) for f in form_data.files]
- names = [f.name for f in form_data.files]
- arguments = UploadEventArguments(sender=self, socket=msg.websocket, files=files, names=names)
- if handle_event(self.upload_handler, arguments):
- page_update = None
- return page_update
- except Exception:
- traceback.print_exc()
|