This is how I have done, I have created a new Document Library where I upload file also I can upload some Metadata too. Below is the code -
function readFile(fileName, claimNo, file) {
//Get File Input Control and read th file name
var element = document.getElementById("attch_id");
var file = element.files[0];
var parts = element.value.split("\\");
var fileName = parts[parts.length - 1];
//Read File contents using file reader
var reader = new FileReader();
reader.onload = function (e) {
uploadFile(e.target.result, fileName);
}
reader.onerror = function (e) {
alert(e.target.error);
}
reader.readAsArrayBuffer(file);
}
var attachmentFiles;
function uploadFile(arrayBuffer, fileName) {
//Get Client Context,Web and List object.
var clientContext = new SP.ClientContext();
var oWeb = clientContext.get_web();
var oList = oWeb.get_lists().getByTitle('AttachmentList');
//Convert the file contents into base64 data
var bytes = new Uint8Array(arrayBuffer);
var i, length, out = '';
for (i = 0, length = bytes.length; i < length; i += 1) {
out += String.fromCharCode(bytes[i]);
}
var base64 = btoa(out);
//Create FileCreationInformation object using the read file data
var createInfo = new SP.FileCreationInformation();
createInfo.set_content(base64);
createInfo.set_url(fileName);
//Add the file to the library
var uploadedDocument = oList.get_rootFolder().get_files().add(createInfo)
var oListItem = uploadedDocument.get_listItemAllFields();
oListItem.set_item('InternalName', "Some Data");
oListItem.update();
//Load client context and execcute the batch
clientContext.load(uploadedDocument);
clientContext.executeQueryAsync(function QuerySuccess() {
alert("File Uploaded Successfully.");
}, function QueryFailure(s, a) {
alert("File Upload failed with error - " + a.get_message());
})
}