Skip to main content

Uploading multiple files to SharePoint List



Wow SharePoint is doing great with SharePoint rest api now you can do almost everything related to SharePoint using rest api. Today I am trying to upload multiple documents to SharePoint list item. You know what the problem is? You first need to create a SharePoint list item and then you can upload documents to the same SharePoint list item.

So let’s now try to create a new SharePoint list item.

function CreateNewItem() {
    var data = {
        __metadata: { 'type': "SP.Data.ListItem" },
        Title: $('#Title').val()
    };

    $.ajax({
        //_spPageContextInfo.webAbsoluteUrl get current SharePoint site url
        url: _spPageContextInfo.webAbsoluteUrl + "/_api/Web/Lists/GetByTitle('" + ListTitle + "')/Items",
        type: "POST",
        headers: {
            "accept": "application/json;odata=verbose",
            "X-RequestDigest": $("#__REQUESTDIGEST").val(),
            "content-Type": "application/json;odata=verbose"
        },
        // to make sync calls.
        async: false,
        data: JSON.stringify(data),
        success: function (data) {
            if (data.d.ID != undefined && data.d.ID > 0)
                //Uploads files to SharePoint List item
                UploadFileToListItem(data.d);
            else
                alert('Item added successfully');
        },
        error: function (error) {
            alert('Problem saving data');
        }
    });
}



Once the item is created now let’s try to upload documents to SharePoint list item.

function UploadFileToListItem(data) {
    var element = document.getElementById("attachment");
    lastFileName = element.files[element.files.length - 1].name;
    for (var i = 0; i < element.files.length; i++) {
        var file = element.files[i];
        uploadFile(data, file);
    }
}

//uploads single file at a time.
function uploadFile(data, file) {
    var getFileBuffer = function (file) {
        var deferred = $.Deferred();
        var reader = new FileReader();

        reader.onload = function (e) {
            deferred.resolve(e.target.result);
        }

        reader.onerror = function (e) {
            deferred.reject(e.target.error);
        }

        reader.readAsArrayBuffer(file);

        return deferred.promise();
    };
    getFileBuffer(file).then(function (buffer) {
        var binary = "";
        var bytes = new Uint8Array(buffer);
        var i = bytes.byteLength;
        while (i--) {
            binary = String.fromCharCode(bytes[i]) + binary;
        }
        var fileName = file.name;
        var error = ''
        $().SPServices({
            operation: "AddAttachment",
            async: false,
            listName: ListTitle,
            listItemID: data.Id,
            fileName: fileName,
            attachment: btoa(binary),
            completefunc: function (xData, Status) {
                console.log(file.name + "uploaded");
            }
        });
    });
}


Above code uses SPServices in order to upload files to SharePoint list item. To be frank I found SPServices to be more easy to use compared to SharePoint rest api. One more important think to take note of is don’t forget to add reference to jquery.SPServices.js on the top of the page.


<script type="text/javascript" src="jquery.SPServices.js"></script>



Below is the HTML that I have used to select multiple files.



<label class="cust-title">Select File:</label>
<input type="file" id="attachment" name="FileUpload" multiple/>

Let’s now try to get all uploaded file names from SharePoint list item.

  function GetListITem(id) {
    var uri = "/sites/spin/it/_api/web/lists/getbytitle('" + ListTitle + "')/items?$filter=Id eq " + id;
    jQuery.ajax
                 ({
                     url: uri,
                     type: "GET",
                     dataType: "json",
                     headers: requestHeaders,
                     async: true,
                     success: function (data) {
                         if (data.d.results != undefined && data.d.results.length > 0) {
                             alert(‘Yes got the data’);

//Get uri of SharePoint List Item document                    GetAllAttachments(data.d.results[0].AttachmentFiles.__deferred.uri);
                         }
                         else {
                             alert('Unable to get data');
                         }
                     },
                     error: function (error) {
                         console.log(JSON.stringify(error));
                         alert('Unable to get data');
                     }
                 });
}

function GetAllAttachments(url){
    $.ajax(
        {
            url: url, 
            method: "GET",
            headers: {
                "ACCEPT": "application/json;odata=verbose",
                "content-type": "application/json;odata=verbose"                        
            },
            success: function (data) {
                var fileNames = "";
                $.each(data.d.results, function(){
                    fileNames += this.FileName + " |";
                });
                alert(fileNames.substring(0,fileNames.length - 1);
            },
            error: function (data) {
                alert("Error in retriving file name." + data);
            }
        });         
}

Regards,
Keyur Pandya




Comments

Popular posts from this blog

Identity client runtime library (IDCRL) did not get a response from the login server.

Recently I was doing some testing with a background PowerShell and encountered a weird error. “Identity client runtime library (IDCRL) did not get a response from the login server”. The error that you might encounter while working with PowerShell. This error is very misleading when it comes to identifying what could go wrong. After doing quite a good amount of research below are the probable causes for the error. Invalid Credentials MFA (Multi-Factor Authentication) Manage security defaults. Solutions Invalid Credentials Check if your credentials are wrong. Especially if you are using variables. MFA (Multi-Factor Authentication) Check if MFA is enabled on the account which you are using. These only affect you badly if you are developing PowerShell for a background Job. Go to Microsoft 365 admin center Users -> Active users -> Select the user -> Manage multifactor authentication -> Select the user -> Disable multi-factor authentication. M...

Business Data Connectivity

I came to a requirement wherein I was supposed to get data from an 3 rd party portal using API’s and then bring them to SharePoint server. The first approach that I finalized was just to make BDC solution that will get data from 3 rd party portal and will deploy it to SharePoint. How to Create BDC solution in SharePoint? I found below link that is having really great description about hot to create and deploy the BDC solution to SharePoint. http://www.c-sharpcorner.com/uploadfile/hung123/creating-business-data-connectivity-service-using-visual-studio-2010/ After creating an POC I came to know that BDC model cannot be deployed on Multi tenant farm. So what can be done next? After some amount of googling I came to know that we can create BDC solution using WCF services also. So I created a WCF service solution that acted as a wrapper that used to fetch data from the portal. We can them publish that service to IIS or Server and use the servic...

Site Design Tasks, Power Automate and Modern Sites

S harePoint Site templates are now replaced with Site designs in Modern Sites. We can create custom site designs using some json script(s). Site Design allows to create lists, create list views, apply theme, customize navigation, create content types, create site columns and so on. Click here to see JSON scheme reference for creating custom site design.  Endpoint to apply site design as a part of flow is as below. _api/Microsoft.Sharepoint.Utilities.WebTemplateExtensions.SiteScriptUtility.AddSiteDesignTaskToCurrentWeb We must use “Send Http Request to SharePoint” action to make an API call to SharePoint. SiteDesignId must be part if body, this is GUID of the SharePoint site design you need to apply. We can line up sequence of calls if we need to apply multiple site designs to a single site. We can now wait for few mins and all our sited designs will get applied or we can also check the status by making another API call with below endpoint. You just need to pass the Apply Desig...