This example uses about 39 lines of code (21 native, 18 Elm) to enable file uploads through normal Elm Http calls (as of 0.18). It's the smallest example I could come up with. No ports, no FileReader. Progress should also work (although not tested yet).
This works by "smuggling" the Javascript File object through Elm as a StringBody. The way Elm handles StringBody is compatible with how you can send a File object via XHR.
Changes
2017-05-08 Added multiple file selection handling