Works with any backend npm install Zero dependencies

External Browse Button

Use any element on the page as the file-browse trigger with the browseButton option.

(function() {
 new MultipleUpload('#demo', {
 uploadUrl: '/api/upload',
 multiple: true,
 browseButton: '#my-browse'
 });
})();

Using a button you already have

browseButton defaults to null, which is when the component renders its own. Point it at a selector or element and that element becomes the trigger instead, so the uploader can sit behind a button that already matches your design system — no overriding of the built-in styles, no fighting specificity.

The hidden input stays hidden

This is the standard way around the fact that a file input cannot be styled. The real input remains in the DOM and off-screen; your button forwards the click to it. Keep the trigger a real <button> rather than a styled <div> so that keyboard focus and screen-reader announcement keep working for free.