Some of the answers here propose using FormData(), but unfortunately that is a browser object not available in Internet Explorer 9 and below. If you need to support those older browsers, you will need a backup strategy such as using
https://github.com/leon/angular-upload – uses iframes as a fallback
https://github.com/danialfarid/ng-file-upload – uses FileAPI/Flash as a fallback
And some other options:
https://github.com/nervgh/angular-file-upload/
https://github.com/uor/angular-file
https://github.com/twilson63/ngUpload
https://github.com/uploadcare/angular-uploadcare
One of these should fit your project, or may give you some insight into how to code it yourself.
The easiest is to use HTML5 API, namely FileReader
HTML is pretty straightforward:
In your controller define ‘add’ method:
$scope.add = function() {
var f = document.getElementById(‘file’).files[0],
r = new FileReader();
r.onloadend = function(e) {
var data = e.target.result;
//send your binary data via $http or $resource or do anything else with it
}
r.readAsBinaryString(f);
}
Browser Compatibility
Desktop Browsers
Edge 12, Firefox(Gecko) 3.6(1.9.2),
Chrome 7, Opera* 12.02, Safari 6.0.2
Mobile Browsers
Firefox(Gecko) 32,
Chrome 3,
Opera* 11.5,
Safari 6.1
Note : readAsBinaryString() method is deprecated and readAsArrayBuffer() should be used instead.