Osvaldas Valutis is right, using the <label>
to trigger the native browser functionality is the way to go. Then style up the label as needed, enhancing with some JavaScript if you like. Same concept as the checkbox hack.
Direct Link to Article — Permalink
Styling & Customizing File Inputs the Smart Way is a post from CSS-Tricks