This example uses about 34 lines of code (19 native, 15 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.
This does not currently handle multi selection. Seems like a simple matter to just return a List File
and initiate an http send per file. But I haven't needed it yet.