Depends on your minimum browser requirements.
It is quite easy to do with HTML 5 File API - see for example
https://egghead.io/lessons/angularjs-file-uploadsand to get nice styling:
http://gregpike.net/demos/bootstrap-file-input/demo.htmlFor older browsers you are basically out of luck: For that case the server API must be able handle a regular form upload. Also the usual trick to avoid a page reload is to specify an iframe as the target, have the server reply with json content, but html mime type and parse the result from the iframe.
There sure is existing code than you can use for that, too.