I think a best practice nowadays would be to use an <input type=file> (which you can hide and "trigger" with .click() when clicking on, say, a button; this is only "cosmetic" though) and XMLHttpRequest advanced features (sending a File object, or possibly a FormData if that's what your server expects; using progress events to track upload).
That requires using JSNI or JsInterop in GWT though.
(note: we've actually been using this for 6 years or so, on an intranet app targeting Firefox ESR; but browser support is much broader nowadays:
http://caniuse.com/#feat=xhr2 )