Ejemplo n.º 1
0
        public static void DeployFileToThemeFolderSite(this Web web, byte[] fileBytes, string fileName, string themeFolderVersion = "15")
        {
            // Get the path to the file which we are about to deploy
            List themesList = web.GetCatalog(123);

            // get the theme list
            web.Context.Load(themesList);
            web.Context.ExecuteQuery();

            Folder           rootFolder  = themesList.RootFolder;
            FolderCollection rootFolders = rootFolder.Folders;

            web.Context.Load(rootFolder);
            web.Context.Load(rootFolders, f => f.Where(folder => folder.Name == themeFolderVersion));
            web.Context.ExecuteQuery();

            Folder folder15 = rootFolders.FirstOrDefault();

            // Use CSOM to upload the file in
            FileCreationInformation newFile = new FileCreationInformation();

            newFile.Content   = fileBytes;
            newFile.Url       = UrlUtility.Combine(folder15.ServerRelativeUrl, fileName);
            newFile.Overwrite = true;

            Microsoft.SharePoint.Client.File uploadFile = folder15.Files.Add(newFile);
            web.Context.Load(uploadFile);
            web.Context.ExecuteQuery();
        }
Ejemplo n.º 2
0
        private Folder GetFolderIfExists(List list, string folder)
        {
            FolderCollection folders = list.RootFolder.Folders;

            SPContext.Load(folders, fl => fl.Include(ct => ct.Name).Where(ct => ct.Name == folder));

            SPContext.ExecuteQuery();

            return(folders.FirstOrDefault());
        }
Ejemplo n.º 3
0
        public static void DeployFileToThemeFolderSite(this Web web, byte[] fileBytes, string fileName, string themeFolderVersion = "15")
        {
            if (fileBytes == null || fileBytes.Length == 0)
            {
                throw new ArgumentNullException("fileBytes");
            }

            if (string.IsNullOrEmpty(fileName))
            {
                throw new ArgumentNullException("fileName");
            }

            if (string.IsNullOrEmpty(themeFolderVersion))
            {
                throw new ArgumentNullException("themeFolderVersion");
            }

            LoggingUtility.Internal.TraceInformation((int)EventId.DeployThemeFile, "Deploying file '{0}' to '{1}' folder '{2}'.", fileName, web.Context.Url, themeFolderVersion);

            // Get the path to the file which we are about to deploy
            List themesList = web.GetCatalog((int)ListTemplateType.ThemeCatalog);

            // get the theme list
            web.Context.Load(themesList);
            web.Context.ExecuteQuery();

            Folder           rootFolder  = themesList.RootFolder;
            FolderCollection rootFolders = rootFolder.Folders;

            web.Context.Load(rootFolder);
            web.Context.Load(rootFolders, f => f.Where(folder => folder.Name == themeFolderVersion));
            web.Context.ExecuteQuery();

            Folder folder15 = rootFolders.FirstOrDefault();

            // Use CSOM to upload the file in
            FileCreationInformation newFile = new FileCreationInformation();

            newFile.Content   = fileBytes;
            newFile.Url       = UrlUtility.Combine(folder15.ServerRelativeUrl, fileName);
            newFile.Overwrite = true;

            Microsoft.SharePoint.Client.File uploadFile = folder15.Files.Add(newFile);
            web.Context.Load(uploadFile);
            web.Context.ExecuteQuery();
        }
Ejemplo n.º 4
0
        public void CleanUp()
        {
            Console.WriteLine("BrandingExtensionsTests.CleanUp");

            if (System.IO.File.Exists(customColorFilePath))
            {
                System.IO.File.Delete(customColorFilePath);
            }
            if (System.IO.File.Exists(customBackgroundFilePath))
            {
                System.IO.File.Delete(customBackgroundFilePath);
            }

            using (var context = TestCommon.CreateClientContext())
            {
                var web = context.Web;

                // Remove composed looks from server
                List      themeGallery = web.GetCatalog((int)ListTemplateType.DesignCatalog);
                CamlQuery query        = new CamlQuery();
                string    camlString   = @"
                    <View>
                        <Query>                
                            <Where>
                                <Contains>
                                    <FieldRef Name='Name' />
                                    <Value Type='Text'>Test_</Value>
                                </Contains>
                            </Where>
                        </Query>
                    </View>";
                query.ViewXml = camlString;
                var found = themeGallery.GetItems(query);
                web.Context.Load(found);
                web.Context.ExecuteQueryRetry();
                Console.WriteLine("{0} matching looks found to delete", found.Count);
                var looksToDelete = found.ToList();
                foreach (var item in looksToDelete)
                {
                    Console.WriteLine("Delete look item '{0}'", item["Name"]);
                    item.DeleteObject();
                    context.ExecuteQueryRetry();
                }

                // Remove Theme Files
                List             themesList  = web.GetCatalog((int)ListTemplateType.ThemeCatalog);
                Folder           rootFolder  = themesList.RootFolder;
                FolderCollection rootFolders = rootFolder.Folders;
                web.Context.Load(rootFolder);
                web.Context.Load(rootFolders, f => f.Where(folder => folder.Name == "15"));
                web.Context.ExecuteQueryRetry();

                Folder folder15 = rootFolders.FirstOrDefault();

                try
                {
                    Microsoft.SharePoint.Client.File customColorFile = folder15.Files.GetByUrl("custom.spcolor");
                    customColorFile.DeleteObject();
                    context.ExecuteQueryRetry();
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Exception cleaning up: {0}", ex);
                }

                try
                {
                    Microsoft.SharePoint.Client.File customBackgroundFile = folder15.Files.GetByUrl("custombg.jpg");
                    customBackgroundFile.DeleteObject();
                    context.ExecuteQueryRetry();
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Exception cleaning up: {0}", ex);
                }

                // Remove webs
                var webCollection1 = web.Webs;
                context.Load(webCollection1, wc => wc.Include(w => w.Title, w => w.ServerRelativeUrl));
                context.ExecuteQueryRetry();
                var websToDelete = new List <Web>();
                foreach (var web1 in webCollection1)
                {
                    if (web1.Title.StartsWith("Test_"))
                    {
                        var webCollection2 = web1.Webs;
                        context.Load(webCollection2, wc => wc.Include(w => w.Title, w => w.ServerRelativeUrl));
                        context.ExecuteQueryRetry();
                        var childrenToDelete = new List <Web>(webCollection2);
                        foreach (var web2 in childrenToDelete)
                        {
                            Console.WriteLine("Deleting site {0}", web2.ServerRelativeUrl);
                            web2.DeleteObject();
                            context.ExecuteQueryRetry();
                        }
                        websToDelete.Add(web1);
                    }
                }

                foreach (var web1 in websToDelete)
                {
                    Console.WriteLine("Deleting site {0}", web1.ServerRelativeUrl);
                    web1.DeleteObject();
                    try
                    {
                        context.ExecuteQueryRetry();
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("Exception cleaning up: {0}", ex);
                    }
                }

                // Remove pagelayouts
                List   masterPageGallery             = context.Web.GetCatalog((int)ListTemplateType.MasterPageCatalog);
                Folder rootFolderInMasterPageGallery = masterPageGallery.RootFolder;
                context.Load(rootFolderInMasterPageGallery, f => f.ServerRelativeUrl);
                context.ExecuteQueryRetry();

                try
                {
                    var fileServerRelativeUrl = UrlUtility.Combine(rootFolderInMasterPageGallery.ServerRelativeUrl, publishingPageWithoutExtension);
                    var file = context.Web.GetFileByServerRelativeUrl(String.Format("{0}.aspx", fileServerRelativeUrl));
                    context.Load(file);
                    context.ExecuteQueryRetry();
                    file.DeleteObject();
                    context.ExecuteQueryRetry();

                    fileServerRelativeUrl = UrlUtility.Combine(rootFolderInMasterPageGallery.ServerRelativeUrl, "test/test", publishingPageWithoutExtension);
                    file = context.Web.GetFileByServerRelativeUrl(String.Format("{0}.aspx", fileServerRelativeUrl));
                    context.Load(file);
                    context.ExecuteQueryRetry();
                    file.DeleteObject();
                    context.ExecuteQueryRetry();
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Exception cleaning up: {0}", ex);
                }
            }

            Teardown();
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Upload files to SharePoint assets library
        /// </summary>
        /// <param name="matterCenterAssetsFolder">Matter Center Assets Folder</param>
        /// <param name="clientContext">Client Context</param>
        /// <param name="siteAssets">Site Assets</param>
        /// <param name="listFolders">List Folders</param>
        /// <param name="listval">Configuration values from Configuration Excel</param>
        private static void UploadFilesToFolder(string matterCenterAssetsFolder, ClientContext clientContext, List siteAssets, FolderCollection listFolders, Dictionary<string, string> listval)
        {
            try
            {
                // Add matter landing folder
                listFolders.Add(matterCenterAssetsFolder);
                siteAssets.RootFolder.Update();
                siteAssets.Update();
                clientContext.Load(listFolders, folders => folders.Include(folderProperty => folderProperty.Name, folderProperty => folderProperty.ServerRelativeUrl).Where(folder => folder.Name == matterCenterAssetsFolder));
                clientContext.ExecuteQuery();

                Console.WriteLine("\n " + matterCenterAssetsFolder + " folder created...");
                string matterCenterAssetsUrl = listFolders.FirstOrDefault().ServerRelativeUrl;
                string staticContentFolder = ConfigurationManager.AppSettings["StaticContentFolder"];
                if (!string.IsNullOrWhiteSpace(matterCenterAssetsUrl))
                {
                    string parentDirectory = Convert.ToString(Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName, CultureInfo.InvariantCulture) + "\\" + staticContentFolder + "\\" + matterCenterAssetsFolder;
                    string matterLandingAssetsFolder = ConfigurationManager.AppSettings["MatterLandingAssets"];
                    string webDashboardAssetsFolder = ConfigurationManager.AppSettings["WebDashboardAssets"];
                    string commonAssetsFolder = ConfigurationManager.AppSettings["CommonAssets"];
                    string documentLandingAssetsFolder = ConfigurationManager.AppSettings["DocumentLandingAssets"];

                    string images = ConfigurationManager.AppSettings["Images"];
                    string scripts = ConfigurationManager.AppSettings["Scripts"];
                    string styles = ConfigurationManager.AppSettings["Styles"];

                    // Create matter landing assets and web dashboard assets folder
                    listFolders.Add(matterCenterAssetsUrl + "/" + matterLandingAssetsFolder);
                    listFolders.Add(matterCenterAssetsUrl + "/" + matterLandingAssetsFolder + "/" + images);
                    listFolders.Add(matterCenterAssetsUrl + "/" + matterLandingAssetsFolder + "/" + scripts);
                    listFolders.Add(matterCenterAssetsUrl + "/" + matterLandingAssetsFolder + "/" + styles);

                    // Add web dashboard folder
                    listFolders.Add(matterCenterAssetsUrl + "/" + webDashboardAssetsFolder);
                    listFolders.Add(matterCenterAssetsUrl + "/" + webDashboardAssetsFolder + "/" + images);
                    listFolders.Add(matterCenterAssetsUrl + "/" + webDashboardAssetsFolder + "/" + scripts);
                    listFolders.Add(matterCenterAssetsUrl + "/" + webDashboardAssetsFolder + "/" + styles);

                    // Add common assets folder
                    listFolders.Add(matterCenterAssetsUrl + "/" + commonAssetsFolder);
                    listFolders.Add(matterCenterAssetsUrl + "/" + commonAssetsFolder + "/" + images);
                    listFolders.Add(matterCenterAssetsUrl + "/" + commonAssetsFolder + "/" + scripts);
                    listFolders.Add(matterCenterAssetsUrl + "/" + commonAssetsFolder + "/" + styles);

                    // Add document landing folder
                    listFolders.Add(matterCenterAssetsUrl + "/" + documentLandingAssetsFolder);
                    listFolders.Add(matterCenterAssetsUrl + "/" + documentLandingAssetsFolder + "/" + images);
                    listFolders.Add(matterCenterAssetsUrl + "/" + documentLandingAssetsFolder + "/" + scripts);
                    listFolders.Add(matterCenterAssetsUrl + "/" + documentLandingAssetsFolder + "/" + styles);

                    siteAssets.Update();
                    clientContext.ExecuteQuery();

                    Console.WriteLine("Created matter landing and web dashboard assets folders.");

                    Console.WriteLine(" ------- Starting to upload assets ------- ");

                    // Upload matter landing assets
                    UploadAssets(parentDirectory + "\\" + matterLandingAssetsFolder, "*", matterCenterAssetsUrl + "/" + matterLandingAssetsFolder, clientContext, listval);
                    // Upload web dashboard images
                    UploadAssets(parentDirectory + "\\" + webDashboardAssetsFolder + "\\" + images, "*", matterCenterAssetsUrl + "/" + webDashboardAssetsFolder + "/" + images, clientContext, listval);
                    // Upload web dashboard scripts
                    UploadAssets(parentDirectory + "\\" + webDashboardAssetsFolder + "\\" + scripts, "*", matterCenterAssetsUrl + "/" + webDashboardAssetsFolder + "/" + scripts, clientContext, listval);
                    // Upload web dashboard styles
                    UploadAssets(parentDirectory + "\\" + webDashboardAssetsFolder + "\\" + styles, "*", matterCenterAssetsUrl + "/" + webDashboardAssetsFolder + "/" + styles, clientContext, listval);
                    // Upload matter landing images
                    UploadAssets(parentDirectory + "\\" + matterLandingAssetsFolder + "\\" + images, "*", matterCenterAssetsUrl + "/" + matterLandingAssetsFolder + "/" + images, clientContext, listval);
                    // Upload matter landing scripts
                    UploadAssets(parentDirectory + "\\" + matterLandingAssetsFolder + "\\" + scripts, "*", matterCenterAssetsUrl + "/" + matterLandingAssetsFolder + "/" + scripts, clientContext, listval);
                    // Upload matter landing styles
                    UploadAssets(parentDirectory + "\\" + matterLandingAssetsFolder + "\\" + styles, "*", matterCenterAssetsUrl + "/" + matterLandingAssetsFolder + "/" + styles, clientContext, listval);
                    // Upload common images
                    UploadAssets(parentDirectory + "\\" + commonAssetsFolder + "\\" + images, "*", matterCenterAssetsUrl + "/" + commonAssetsFolder + "/" + images, clientContext, listval);
                    // Upload common scripts
                    UploadAssets(parentDirectory + "\\" + commonAssetsFolder + "\\" + scripts, "*", matterCenterAssetsUrl + "/" + commonAssetsFolder + "/" + scripts, clientContext, listval);
                    // Upload common styles
                    UploadAssets(parentDirectory + "\\" + commonAssetsFolder + "\\" + styles, "*", matterCenterAssetsUrl + "/" + commonAssetsFolder + "/" + styles, clientContext, listval);

                    UploadAssets(parentDirectory + "\\" + documentLandingAssetsFolder + "\\" + scripts, "*", matterCenterAssetsUrl + "/" + documentLandingAssetsFolder + "/" + scripts, clientContext, listval);

                    UploadAssets(parentDirectory + "\\" + documentLandingAssetsFolder + "\\" + images, "*", matterCenterAssetsUrl + "/" + documentLandingAssetsFolder + "/" + images, clientContext, listval);

                    UploadAssets(parentDirectory + "\\" + documentLandingAssetsFolder + "\\" + styles, "*", matterCenterAssetsUrl + "/" + documentLandingAssetsFolder + "/" + styles, clientContext, listval);
                }
                else
                {
                    Console.WriteLine("\n Something went wrong. The matter center assets folder is not created or unable to browse.");
                }
            }
            catch (Exception exception)
            {
                ErrorLogger.LogErrorToTextFile(errorFilePath, "Message: " + exception.Message + "\nStacktrace: " + exception.StackTrace);
            }
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Upload files to SharePoint assets library
        /// </summary>
        /// <param name="matterCenterAssetsFolder">Matter Center Assets Folder</param>
        /// <param name="clientContext">Client Context</param>
        /// <param name="siteAssets">Site Assets</param>
        /// <param name="listFolders">List Folders</param>
        /// <param name="listval">Configuration values from Configuration Excel</param>
        private static void UploadFilesToFolder(string matterCenterAssetsFolder, ClientContext clientContext, List siteAssets, FolderCollection listFolders, Dictionary <string, string> listval)
        {
            try
            {
                // Add matter landing folder
                listFolders.Add(matterCenterAssetsFolder);
                siteAssets.RootFolder.Update();
                siteAssets.Update();
                clientContext.Load(listFolders, folders => folders.Include(folderProperty => folderProperty.Name, folderProperty => folderProperty.ServerRelativeUrl).Where(folder => folder.Name == matterCenterAssetsFolder));
                clientContext.ExecuteQuery();

                Console.WriteLine("\n " + matterCenterAssetsFolder + " folder created...");
                string matterCenterAssetsUrl = listFolders.FirstOrDefault().ServerRelativeUrl;
                string staticContentFolder   = ConfigurationManager.AppSettings["StaticContentFolder"];
                if (!string.IsNullOrWhiteSpace(matterCenterAssetsUrl))
                {
                    string parentDirectory             = Convert.ToString(Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName, CultureInfo.InvariantCulture) + "\\" + staticContentFolder + "\\" + matterCenterAssetsFolder;
                    string matterLandingAssetsFolder   = ConfigurationManager.AppSettings["MatterLandingAssets"];
                    string webDashboardAssetsFolder    = ConfigurationManager.AppSettings["WebDashboardAssets"];
                    string commonAssetsFolder          = ConfigurationManager.AppSettings["CommonAssets"];
                    string documentLandingAssetsFolder = ConfigurationManager.AppSettings["DocumentLandingAssets"];

                    string images  = ConfigurationManager.AppSettings["Images"];
                    string scripts = ConfigurationManager.AppSettings["Scripts"];
                    string styles  = ConfigurationManager.AppSettings["Styles"];

                    // Create matter landing assets and web dashboard assets folder
                    listFolders.Add(matterCenterAssetsUrl + "/" + matterLandingAssetsFolder);
                    listFolders.Add(matterCenterAssetsUrl + "/" + matterLandingAssetsFolder + "/" + images);
                    listFolders.Add(matterCenterAssetsUrl + "/" + matterLandingAssetsFolder + "/" + scripts);
                    listFolders.Add(matterCenterAssetsUrl + "/" + matterLandingAssetsFolder + "/" + styles);

                    // Add web dashboard folder
                    listFolders.Add(matterCenterAssetsUrl + "/" + webDashboardAssetsFolder);
                    listFolders.Add(matterCenterAssetsUrl + "/" + webDashboardAssetsFolder + "/" + images);
                    listFolders.Add(matterCenterAssetsUrl + "/" + webDashboardAssetsFolder + "/" + scripts);
                    listFolders.Add(matterCenterAssetsUrl + "/" + webDashboardAssetsFolder + "/" + styles);

                    // Add common assets folder
                    listFolders.Add(matterCenterAssetsUrl + "/" + commonAssetsFolder);
                    listFolders.Add(matterCenterAssetsUrl + "/" + commonAssetsFolder + "/" + images);
                    listFolders.Add(matterCenterAssetsUrl + "/" + commonAssetsFolder + "/" + scripts);
                    listFolders.Add(matterCenterAssetsUrl + "/" + commonAssetsFolder + "/" + styles);

                    // Add document landing folder
                    listFolders.Add(matterCenterAssetsUrl + "/" + documentLandingAssetsFolder);
                    listFolders.Add(matterCenterAssetsUrl + "/" + documentLandingAssetsFolder + "/" + images);
                    listFolders.Add(matterCenterAssetsUrl + "/" + documentLandingAssetsFolder + "/" + scripts);
                    listFolders.Add(matterCenterAssetsUrl + "/" + documentLandingAssetsFolder + "/" + styles);

                    siteAssets.Update();
                    clientContext.ExecuteQuery();

                    Console.WriteLine("Created matter landing and web dashboard assets folders.");

                    Console.WriteLine(" ------- Starting to upload assets ------- ");

                    // Upload matter landing assets
                    UploadAssets(parentDirectory + "\\" + matterLandingAssetsFolder, "*", matterCenterAssetsUrl + "/" + matterLandingAssetsFolder, clientContext, listval);
                    // Upload web dashboard images
                    UploadAssets(parentDirectory + "\\" + webDashboardAssetsFolder + "\\" + images, "*", matterCenterAssetsUrl + "/" + webDashboardAssetsFolder + "/" + images, clientContext, listval);
                    // Upload web dashboard scripts
                    UploadAssets(parentDirectory + "\\" + webDashboardAssetsFolder + "\\" + scripts, "*", matterCenterAssetsUrl + "/" + webDashboardAssetsFolder + "/" + scripts, clientContext, listval);
                    // Upload web dashboard styles
                    UploadAssets(parentDirectory + "\\" + webDashboardAssetsFolder + "\\" + styles, "*", matterCenterAssetsUrl + "/" + webDashboardAssetsFolder + "/" + styles, clientContext, listval);
                    // Upload matter landing images
                    UploadAssets(parentDirectory + "\\" + matterLandingAssetsFolder + "\\" + images, "*", matterCenterAssetsUrl + "/" + matterLandingAssetsFolder + "/" + images, clientContext, listval);
                    // Upload matter landing scripts
                    UploadAssets(parentDirectory + "\\" + matterLandingAssetsFolder + "\\" + scripts, "*", matterCenterAssetsUrl + "/" + matterLandingAssetsFolder + "/" + scripts, clientContext, listval);
                    // Upload matter landing styles
                    UploadAssets(parentDirectory + "\\" + matterLandingAssetsFolder + "\\" + styles, "*", matterCenterAssetsUrl + "/" + matterLandingAssetsFolder + "/" + styles, clientContext, listval);
                    // Upload common images
                    UploadAssets(parentDirectory + "\\" + commonAssetsFolder + "\\" + images, "*", matterCenterAssetsUrl + "/" + commonAssetsFolder + "/" + images, clientContext, listval);
                    // Upload common scripts
                    UploadAssets(parentDirectory + "\\" + commonAssetsFolder + "\\" + scripts, "*", matterCenterAssetsUrl + "/" + commonAssetsFolder + "/" + scripts, clientContext, listval);
                    // Upload common styles
                    UploadAssets(parentDirectory + "\\" + commonAssetsFolder + "\\" + styles, "*", matterCenterAssetsUrl + "/" + commonAssetsFolder + "/" + styles, clientContext, listval);

                    UploadAssets(parentDirectory + "\\" + documentLandingAssetsFolder + "\\" + scripts, "*", matterCenterAssetsUrl + "/" + documentLandingAssetsFolder + "/" + scripts, clientContext, listval);

                    UploadAssets(parentDirectory + "\\" + documentLandingAssetsFolder + "\\" + images, "*", matterCenterAssetsUrl + "/" + documentLandingAssetsFolder + "/" + images, clientContext, listval);

                    UploadAssets(parentDirectory + "\\" + documentLandingAssetsFolder + "\\" + styles, "*", matterCenterAssetsUrl + "/" + documentLandingAssetsFolder + "/" + styles, clientContext, listval);
                }
                else
                {
                    Console.WriteLine("\n Something went wrong. The matter center assets folder is not created or unable to browse.");
                }
            }
            catch (Exception exception)
            {
                ErrorLogger.LogErrorToTextFile(errorFilePath, "Message: " + exception.Message + "\nStacktrace: " + exception.StackTrace);
            }
        }
Ejemplo n.º 7
0
        public FileUploadResult UploadFile(Stream file, string filename, string mimeType, string folderName)
        {
            // TODO: Consider updating this to use PnP Core when it supports .NET Standard (https://github.com/pnp/PnP-Sites-Core)
            Uri       site = new Uri(_options.SiteUrl);
            const int fileChunkSizeInMB = 3;

            Microsoft.SharePoint.Client.File uploadFile = null;

            using (var authenticationManager = new AuthenticationManager(_options.TenantId))
            {
                using (var ctx = authenticationManager.GetContext(site, _options.ClientId, _options.ClientSecret))
                {
                    // https://docs.microsoft.com/en-us/sharepoint/dev/solution-guidance/upload-large-files-sample-app-for-sharepoint

                    // Each sliced upload requires a unique id
                    Guid uploadId = Guid.NewGuid();

                    // TODO: Library name would be dynamic, based on type of amendment (dependent on amendment data model)
                    List uploadLibrary = ctx.Web.Lists.GetByTitle("Amendment");

                    // create dedicated folder if one has not already been created for this amendment
                    // TODO: Re-work interface so that folder is created ahead of uploading first file, then this
                    // check can be removed.
                    FolderCollection folders = uploadLibrary.RootFolder.Folders;
                    ctx.Load(folders);
                    ctx.ExecuteQuery();

                    folderName = folderName.Trim();

                    var targetFolder = folders.FirstOrDefault(x => x.Name == folderName);

                    if (targetFolder == null)
                    {
                        // create folder
                        targetFolder = folders.Add(folderName);
                        ctx.Load(targetFolder);
                        ctx.ExecuteQuery();
                    }

                    // Calculate block size in bytes
                    int blockSize = fileChunkSizeInMB * 1024 * 1024;

                    // Get the size of the file
                    long fileSize = file.Length;

                    if (fileSize <= blockSize)
                    {
                        // Use regular approach
                        FileCreationInformation fileInfo = new FileCreationInformation();
                        fileInfo.ContentStream = file;
                        fileInfo.Url           = filename;
                        fileInfo.Overwrite     = true;
                        uploadFile             = targetFolder.Files.Add(fileInfo);
                        ctx.Load(uploadFile);
                        ctx.ExecuteQuery();
                    }
                    else
                    {
                        // Use large file upload approach
                        ClientResult <long> bytesUploaded = null;

                        using (BinaryReader br = new BinaryReader(file))
                        {
                            byte[] buffer         = new byte[blockSize];
                            long   fileoffset     = 0;
                            long   totalBytesRead = 0;
                            int    bytesRead;
                            bool   first = true;

                            // Read data from filesystem in blocks
                            while ((bytesRead = br.Read(buffer, 0, buffer.Length)) > 0)
                            {
                                totalBytesRead = totalBytesRead + bytesRead;

                                if (first)
                                {
                                    using (MemoryStream contentStream = new MemoryStream())
                                    {
                                        // Add an empty file.
                                        FileCreationInformation fileInfo = new FileCreationInformation();
                                        fileInfo.ContentStream = contentStream;
                                        fileInfo.Url           = filename;
                                        fileInfo.Overwrite     = true;
                                        uploadFile             = targetFolder.Files.Add(fileInfo);

                                        // Start upload by uploading the first slice.
                                        using (MemoryStream s = new MemoryStream(buffer))
                                        {
                                            // Call the start upload method on the first slice
                                            bytesUploaded = uploadFile.StartUpload(uploadId, s);
                                            ctx.ExecuteQuery();
                                            // fileoffset is the pointer where the next slice will be added
                                            fileoffset = bytesUploaded.Value;
                                        }

                                        // we can only start the upload once
                                        first = false;
                                    }
                                }
                                else
                                {
                                    // Get a reference to our file
                                    uploadFile = ctx.Web.GetFileByServerRelativeUrl(
                                        targetFolder.ServerRelativeUrl + System.IO.Path.AltDirectorySeparatorChar + filename);

                                    if (totalBytesRead == fileSize)
                                    {
                                        // We've reached the end of the file
                                        using (MemoryStream s = new MemoryStream(buffer, 0, bytesRead))
                                        {
                                            // End sliced upload by calling FinishUpload
                                            uploadFile = uploadFile.FinishUpload(uploadId, fileoffset, s);
                                            ctx.ExecuteQuery();

                                            break;
                                        }
                                    }
                                    else
                                    {
                                        using (MemoryStream s = new MemoryStream(buffer))
                                        {
                                            // Continue sliced upload
                                            bytesUploaded = uploadFile.ContinueUpload(uploadId, fileoffset, s);
                                            ctx.ExecuteQuery();
                                            // update fileoffset for the next slice
                                            fileoffset = bytesUploaded.Value;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            return(new FileUploadResult
            {
                FileId = uploadFile.UniqueId,
                FileName = filename,
                FileSizeInBytes = uploadFile.Length,
                FolderName = folderName
            });
        }