Every Upload has a real <input type="file"> carrying name, accept, multiple and the directory attributes. It is hidden with display: none, so it cannot be focused, reached or labeled. The control is whatever you put around it.
- The input sits inside the trigger, and a click on the trigger opens it. Whatever can be activated in the trigger is the control.
- aria-* and data-* props passed to Upload land on the hidden input. An aria-label there names something nobody can reach, so name the trigger instead.
- id is worth passing, since a <label> uses it. It is left off when there are no children or the Upload is disabled, so a label cannot open a picker that is not there.