SharePoint 2010/2013
Introduction
This article is about how to use REST api to attach file to a list item in SharePoint 2010/2013.
Let's Start
Create a JavaScript function named addFile . Pass ListName and ItemId as a parameter to addFile function as show below:-
functionaddFile(listName,itemId){ var allFiles = [];varinput = document.getElementById('file');varfile = input.files[0];if(file != null && file.size > 0) { allFiles.push(file); }if(allFiles.length > 0) { uploadFile(listName, itemId, allFiles); }else{ alert("Please select the Attachment"); } }
UploadFile function is going to attach file to a list item using REST api as show below:-
functionuploadFile(listName, id, file) {vardeferred = $.Deferred();varfileName = file.name; getFileBuffer(file).then(function(buffer) {varbytes =newUint8Array(buffer);varbinary = '';for(varb = 0; b < bytes.length; b++) { binary += String.fromCharCode(bytes[b]); }varscriptbase = _spPageContextInfo.webServerRelativeUrl + "/_layouts/15/"; console.log(' File size:' + bytes.length); $.getScript(scriptbase + "SP.RequestExecutor.js",function() {varcreateitem =newSP.RequestExecutor(_spPageContextInfo.webServerRelativeUrl); createitem.executeAsync({ url: _spPageContextInfo.webServerRelativeUrl + "/_api/web/lists/GetByTitle('" + listName + "')/items(" + id + ")/AttachmentFiles/add(FileName='" + fileName + "')", method: "POST", binaryStringRequestBody:true, body: binary, success: fsucc, error: ferr, state: "Update" });functionfsucc(data) { console.log(data + ' uploaded successfully'); deferred.resolve(data); }functionferr(data) { console.log(fileName + "not uploaded error"); deferred.reject(data); } }); },function(err) { deferred.reject(err); } ); return deferred.promise(); }
Convert file to stream of bytes using FileReader() Object .
functiongetFileBuffer(file) {vardeferred = $.Deferred();varreader =newFileReader(); reader.onload =function(e) { deferred.resolve(e.target.result); } reader.onerror =function(e) { deferred.reject(e.target.error); } reader.readAsArrayBuffer(file);returndeferred.promise(); }