Source code for ipywidgets.widgets.widget_upload

# Copyright(c) Jupyter Development Team.
# Distributed under the terms of the Modified BSD License.

"""FileUpload class.

Represents a file upload button.
"""
import datetime as dt

from traitlets import (
    observe, default, Unicode, Dict, Int, Bool, Bytes, CaselessStrEnum
)

from .widget_description import DescriptionWidget
from .valuewidget import ValueWidget
from .widget_core import CoreWidget
from .widget_button import ButtonStyle
from .widget import register, widget_serialization
from .trait_types import InstanceDict, TypedTuple
from traitlets import Bunch


def _deserialize_single_file(js):
    uploaded_file = Bunch()
    for attribute in ['name', 'type', 'size', 'content']:
        uploaded_file[attribute] = js[attribute]
    uploaded_file['last_modified'] = dt.datetime.fromtimestamp(
        js['last_modified'] / 1000,
        tz=dt.timezone.utc
    )
    return uploaded_file


def _deserialize_value(js, _):
    return [_deserialize_single_file(entry) for entry in js]


def _serialize_single_file(uploaded_file):
    js = {}
    for attribute in ['name', 'type', 'size', 'content']:
        js[attribute] = uploaded_file[attribute]
    js['last_modified'] = int(uploaded_file['last_modified'].timestamp() * 1000)
    return js


def _serialize_value(value, _):
    return [_serialize_single_file(entry) for entry in value]


_value_serialization = {
    'from_json': _deserialize_value,
    'to_json': _serialize_value
}


[docs]@register class FileUpload(DescriptionWidget, ValueWidget, CoreWidget): """File upload widget This creates a file upload input that allows the user to select one or more files to upload. The file metadata and content can be retrieved in the kernel. Examples -------- >>> import ipywidgets as widgets >>> uploader = widgets.FileUpload() # After displaying `uploader` and uploading a file: >>> uploader.value [ { 'name': 'example.txt', 'type': 'text/plain', 'size': 36, 'last_modified': datetime.datetime(2020, 1, 9, 15, 58, 43, 321000, tzinfo=datetime.timezone.utc), 'content': <memory at 0x10c1b37c8> } ] >>> uploader.value[0].content.tobytes() b'This is the content of example.txt.\n' Parameters ---------- accept: str, optional Which file types to accept, e.g. '.doc,.docx'. For a full description of how to specify this, see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#attr-accept Defaults to accepting all file types. multiple: bool, optional Whether to accept multiple files at the same time. Defaults to False. disabled: bool, optional Whether user interaction is enabled. icon: str, optional The icon to use for the button displayed on the screen. Can be any Font-awesome icon without the fa- prefix. Defaults to 'upload'. If missing, no icon is shown. description: str, optional The text to show on the label. Defaults to 'Upload'. button_style: str, optional One of 'primary', 'success', 'info', 'warning', 'danger' or ''. style: widgets.widget_button.ButtonStyle, optional Style configuration for the button. value: Tuple[Dict], optional The value of the last uploaded file or set of files. See the documentation for details of how to use this to retrieve file content and metadata: https://ipywidgets.readthedocs.io/en/stable/examples/Widget%20List.html#File-Upload error: str, optional Whether the last upload triggered an error. """ _model_name = Unicode('FileUploadModel').tag(sync=True) _view_name = Unicode('FileUploadView').tag(sync=True) accept = Unicode(help='File types to accept, empty string for all').tag(sync=True) multiple = Bool(help='If True, allow for multiple files upload').tag(sync=True) disabled = Bool(help='Enable or disable button').tag(sync=True) icon = Unicode('upload', help="Font-awesome icon name, without the 'fa-' prefix.").tag(sync=True) button_style = CaselessStrEnum( values=['primary', 'success', 'info', 'warning', 'danger', ''], default_value='', help='Use a predefined styling for the button.').tag(sync=True) style = InstanceDict(ButtonStyle).tag(sync=True, **widget_serialization) error = Unicode(help='Error message').tag(sync=True) value = TypedTuple(Dict(), help='The file upload value').tag( sync=True, echo_update=False, **_value_serialization) @default('description') def _default_description(self): return 'Upload'