o
    沪gA                     @  st  U d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZmZ d d
lmZmZmZmZmZ d dlmZ d dlm Z! d dl"m#Z$ d dl%m&Z& d dl'm(Z(m)Z) d dl*m+Z+m,Z,m-Z-m.Z. d dl/m0Z0m1Z1 erd dl2m3Z3 d dl4m5Z5 e	e1e0e6e	e1e0f  df Z7de8d< d!ddZ9eG dd dZ:G dd  d Z;dS )"    )annotations)	dataclass)dedent)TYPE_CHECKINGLiteralUnioncastoverload)	TypeAlias)config)normalize_upload_file_type)current_form_id)check_widget_policiesmaybe_raise_label_warnings)KeyLabelVisibilitycompute_and_register_element_id get_label_visibility_proto_valueto_key)FileUploaderState)UploadedFileInfo)FileUploader)gather_metrics)ScriptRunContextget_script_run_ctx)
WidgetArgsWidgetCallbackWidgetKwargsregister_widget)DeletedFileUploadedFile)Sequence)DeltaGeneratorNr
   SomeUploadedFileswidget_valueFileUploaderStateProto | Nonereturn list[UploadedFile | DeletedFile]c           	      C  s   | d u rg S t  }|d u rg S | j}t|dkrg S |jj|jdd |D d}dd |D }g }|D ] }||j}|d urKt||j	}|
| q3|
t|j q3|S )Nr   c                 S  s   g | ]}|j qS  file_id.0fr(   r(   d/var/www/html/chatdoc2/venv/lib/python3.10/site-packages/streamlit/elements/widgets/file_uploader.py
<listcomp>O   s    z%_get_upload_files.<locals>.<listcomp>)
session_idfile_idsc                 S  s   i | ]}|j |qS r(   r)   r+   r(   r(   r.   
<dictcomp>R   s    z%_get_upload_files.<locals>.<dictcomp>)r   uploaded_file_infolenuploaded_file_mgr	get_filesr0   getr*   r    	file_urlsappendr   )	r$   ctxr3   file_recs_list	file_recscollected_filesr-   maybe_file_recuploaded_filer(   r(   r.   _get_upload_files?   s*   r@   c                   @  s*   e Zd ZU ded< dd	d
ZdddZdS )FileUploaderSerdeboolaccept_multiple_filesui_valuer%   	widget_idstrr&   r#   c                 C  s@   t |}t|dkr| jrg }|S d }|S | jr|n|d }|S )Nr   )r@   r4   rC   )selfrD   rE   upload_filesreturn_valuer(   r(   r.   deserializee   s   
zFileUploaderSerde.deserializefilesFileUploaderStateProtoc                 C  sh   t  }|s|S t|ts|g}|D ] }t|trq|j }|j|_|j|_|j|_|j	
|j q|S N)rL   
isinstancelistr   r3   addr*   namesizer8   CopyFrom
_file_urls)rG   rK   state_protor-   	file_infor(   r(   r.   	serializer   s   


zFileUploaderSerde.serializeN)rD   r%   rE   rF   r&   r#   )rK   r#   r&   rL   )__name__
__module____qualname____annotations__rJ   rW   r(   r(   r(   r.   rA   a   s   
 
rA   c                   @  s   e Zd Ze					d/dddd0ddZe						d1dddd2ddZeddddddddd d3d!dZedddddddddd"	d4d#dZed$							d5dddd6d&dZ							d5dddd'd7d*d+Zed8d-d.ZdS )9FileUploaderMixinNFvisible)disabledlabel_visibilitylabelrF   typestr | Sequence[str] | NonerC   Literal[True]key
Key | Nonehelp
str | None	on_changeWidgetCallback | NoneargsWidgetArgs | NonekwargsWidgetKwargs | Noner^   rB   r_   r   r&   list[UploadedFile] | Nonec	                C     d S rM   r(   rG   r`   ra   rC   rd   rf   rh   rj   rl   r^   r_   r(   r(   r.   file_uploader      zFileUploaderMixin.file_uploaderLiteral[False]UploadedFile | Nonec	                C  ro   rM   r(   rp   r(   r(   r.   rq      rr   )ra   rd   rf   rh   rj   rl   r^   r_   c       	         C  ro   rM   r(   rG   r`   rC   ra   rd   rf   rh   rj   rl   r^   r_   r(   r(   r.   rq      rr   )	rC   ra   rd   rf   rh   rj   rl   r^   r_   c       	         C  ro   rM   r(   ru   r(   r(   r.   rq      rr   rq   (UploadedFile | list[UploadedFile] | Nonec	                C  s&   t  }| j|||||||||	|
|dS )a/  Display a file uploader widget.
        By default, uploaded files are limited to 200MB. You can configure
        this using the ``server.maxUploadSize`` config option. For more info
        on how to set config options, see
        https://docs.streamlit.io/develop/api-reference/configuration/config.toml

        Parameters
        ----------
        label : str
            A short label explaining to the user what this file uploader is for.
            The label can optionally contain GitHub-flavored Markdown of the
            following types: Bold, Italics, Strikethroughs, Inline Code, Links,
            and Images. Images display like icons, with a max height equal to
            the font height.

            Unsupported Markdown elements are unwrapped so only their children
            (text contents) render. Display unsupported elements as literal
            characters by backslash-escaping them. E.g.,
            ``"1\. Not an ordered list"``.

            See the ``body`` parameter of |st.markdown|_ for additional,
            supported Markdown directives.

            For accessibility reasons, you should never set an empty label, but
            you can hide it with ``label_visibility`` if needed. In the future,
            we may disallow empty labels by raising an exception.

            .. |st.markdown| replace:: ``st.markdown``
            .. _st.markdown: https://docs.streamlit.io/develop/api-reference/text/st.markdown

        type : str or list of str or None
            Array of allowed extensions. ['png', 'jpg']
            The default is None, which means all extensions are allowed.

        accept_multiple_files : bool
            If True, allows the user to upload multiple files at the same time,
            in which case the return value will be a list of files.
            Default: False

        key : str or int
            An optional string or integer to use as the unique key for the widget.
            If this is omitted, a key will be generated for the widget
            based on its content. No two widgets may have the same key.

        help : str or None
            A tooltip that gets displayed next to the widget label. Streamlit
            only displays the tooltip when ``label_visibility="visible"``. If
            this is ``None`` (default), no tooltip is displayed.

            The tooltip can optionally contain GitHub-flavored Markdown,
            including the Markdown directives described in the ``body``
            parameter of ``st.markdown``.

        on_change : callable
            An optional callback invoked when this file_uploader's value
            changes.

        args : tuple
            An optional tuple of args to pass to the callback.

        kwargs : dict
            An optional dict of kwargs to pass to the callback.

        disabled : bool
            An optional boolean that disables the file uploader if set to
            ``True``. The default is ``False``.

        label_visibility : "visible", "hidden", or "collapsed"
            The visibility of the label. The default is ``"visible"``. If this
            is ``"hidden"``, Streamlit displays an empty spacer instead of the
            label, which can help keep the widget alligned with other widgets.
            If this is ``"collapsed"``, Streamlit displays no label or spacer.

        Returns
        -------
        None or UploadedFile or list of UploadedFile
            - If accept_multiple_files is False, returns either None or
              an UploadedFile object.
            - If accept_multiple_files is True, returns a list with the
              uploaded files as UploadedFile objects. If no files were
              uploaded, returns an empty list.

            The UploadedFile class is a subclass of BytesIO, and therefore is
            "file-like". This means you can pass an instance of it anywhere a
            file is expected.

        Examples
        --------
        Insert a file uploader that accepts a single file at a time:

        >>> import streamlit as st
        >>> import pandas as pd
        >>> from io import StringIO
        >>>
        >>> uploaded_file = st.file_uploader("Choose a file")
        >>> if uploaded_file is not None:
        ...     # To read file as bytes:
        ...     bytes_data = uploaded_file.getvalue()
        ...     st.write(bytes_data)
        >>>
        ...     # To convert to a string based IO:
        ...     stringio = StringIO(uploaded_file.getvalue().decode("utf-8"))
        ...     st.write(stringio)
        >>>
        ...     # To read file as string:
        ...     string_data = stringio.read()
        ...     st.write(string_data)
        >>>
        ...     # Can be used wherever a "file-like" object is accepted:
        ...     dataframe = pd.read_csv(uploaded_file)
        ...     st.write(dataframe)

        Insert a file uploader that accepts multiple files at a time:

        >>> import streamlit as st
        >>>
        >>> uploaded_files = st.file_uploader(
        ...     "Choose a CSV file", accept_multiple_files=True
        ... )
        >>> for uploaded_file in uploaded_files:
        ...     bytes_data = uploaded_file.read()
        ...     st.write("filename:", uploaded_file.name)
        ...     st.write(bytes_data)

        .. output::
           https://doc-file-uploader.streamlit.app/
           height: 375px

        )r`   ra   rC   rd   rf   rh   rj   rl   r^   r_   r:   )r   _file_uploader)rG   r`   ra   rC   rd   rf   rh   rj   rl   r^   r_   r:   r(   r(   r.   rq      s    )r_   r^   r:   r:   ScriptRunContext | Nonec	             
   C  s"  t |}t| j||d dd t||	 td|t| j||||d}|r't|}t }||_||_	|d ur6|ng |j
d d < td|_||_t| j|_|
|_t|	|j_|d ur^t||_t|}t|j||||j|j|dd}| jd| t|jtrd S t|jtrdd	 |jD S |jS )
NF)default_valuewrites_allowedrq   )user_keyform_idr`   ra   rC   rf   zserver.maxUploadSizefile_uploader_state_value)on_change_handlerrj   rl   deserializer
serializerr:   
value_typec                 S  s   g | ]	}t |ts|qS r(   )rN   r   r+   r(   r(   r.   r/     s    z4FileUploaderMixin._file_uploader.<locals>.<listcomp>)r   r   dgr   r   r   r   FileUploaderProtoidr`   ra   r   
get_optionmax_upload_size_mbmultiple_filesr|   r^   r   r_   valuer   rf   rA   r   rJ   rW   _enqueuerN   r   rO   )rG   r`   ra   rC   rd   rf   rh   rj   rl   r_   r^   r:   
element_idfile_uploader_protoserdewidget_stater(   r(   r.   rw   }  sh   


z FileUploaderMixin._file_uploaderr"   c                 C  s
   t d| S )zGet our DeltaGenerator.r"   )r   )rG   r(   r(   r.   r     s   
zFileUploaderMixin.dg)NNNNN)r`   rF   ra   rb   rC   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   r^   rB   r_   r   r&   rn   )FNNNNN)r`   rF   ra   rb   rC   rs   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   r^   rB   r_   r   r&   rt   )r`   rF   rC   rc   ra   rb   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   r^   rB   r_   r   r&   rn   )r`   rF   rC   rs   ra   rb   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   r^   rB   r_   r   r&   rt   )NFNNNNN)r`   rF   ra   rb   rC   rB   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   r^   rB   r_   r   r&   rv   )r`   rF   ra   rb   rC   rB   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   r_   r   r^   rB   r:   rx   r&   rv   )r&   r"   )	rX   rY   rZ   r	   rq   r   rw   propertyr   r(   r(   r(   r.   r\      s     "Qr\   )r$   r%   r&   r'   )<
__future__r   dataclassesr   textwrapr   typingr   r   r   r   r	   typing_extensionsr
   	streamlitr   *streamlit.elements.lib.file_uploader_utilsr   !streamlit.elements.lib.form_utilsr   streamlit.elements.lib.policiesr   r   streamlit.elements.lib.utilsr   r   r   r   r   streamlit.proto.Common_pb2r   rL   r   UploadedFileInfoProto streamlit.proto.FileUploader_pb2r   r   streamlit.runtime.metrics_utilr   streamlit.runtime.scriptrunnerr   r   streamlit.runtime.stater   r   r   r   'streamlit.runtime.uploaded_file_managerr   r    collections.abcr!   streamlit.delta_generatorr"   rO   r#   r[   r@   rA   r\   r(   r(   r(   r.   <module>   s>   
"$