private ProvisioningTemplate GetFileContents(Web web, ProvisioningTemplate template, string welcomePageUrl, ProvisioningTemplateCreationInformation creationInfo, PnPMonitoredScope scope) { var homepageUrl = web.RootFolder.WelcomePage; if (string.IsNullOrEmpty(homepageUrl)) { homepageUrl = "Default.aspx"; } var fullUri = new Uri(UrlUtility.Combine(web.Url, homepageUrl)); var folderPath = fullUri.Segments.Take(fullUri.Segments.Count() - 1).ToArray().Aggregate((i, x) => i + x).TrimEnd('/'); var fileName = fullUri.Segments[fullUri.Segments.Count() - 1]; var webParts = web.GetWebParts(welcomePageUrl); var file = web.GetFileByServerRelativeUrl(welcomePageUrl); var homeFile = new Model.File() { Folder = Tokenize(folderPath, web.Url), Src = fileName, Overwrite = true, }; // Add field values to file RetrieveFieldValues(web, file, homeFile); // Add WebParts to file foreach (var webPart in webParts) { var webPartxml = TokenizeWebPartXml(web, web.GetWebPartXml(webPart.Id, welcomePageUrl)); Model.WebPart newWp = new Model.WebPart() { Title = webPart.WebPart.Title, Row = (uint)webPart.WebPart.ZoneIndex, Order = (uint)webPart.WebPart.ZoneIndex, Contents = webPartxml }; #if !SP2016 // As long as we've no CSOM library that has the ZoneID we can't use the version check as things don't compile... if (web.Context.HasMinimalServerLibraryVersion(Constants.MINIMUMZONEIDREQUIREDSERVERVERSION)) { newWp.Zone = webPart.ZoneId; } #endif homeFile.WebParts.Add(newWp); } template.Files.Add(homeFile); // Persist file using connector if (creationInfo.PersistBrandingFiles) { creationInfo.PersistFile(folderPath, fileName, web, scope); } return(template); }
/// <summary> /// Retrieves <see cref="Stream"/> from connector. If the file name contains special characters (e.g. "%20") and cannot be retrieved, a workaround will be performed /// </summary> private static Stream GetFileStream(ProvisioningTemplate template, Model.File file) { var fileName = file.Src; var container = String.Empty; if (fileName.Contains(@"\") || fileName.Contains(@"/")) { var tempFileName = fileName.Replace(@"/", @"\"); container = fileName.Substring(0, tempFileName.LastIndexOf(@"\")); fileName = fileName.Substring(tempFileName.LastIndexOf(@"\") + 1); } // add the default provided container (if any) if (!String.IsNullOrEmpty(container)) { if (!String.IsNullOrEmpty(template.Connector.GetContainer())) { if (container.StartsWith("/")) { container = container.TrimStart("/".ToCharArray()); } #if !NETSTANDARD2_0 if (template.Connector.GetType() == typeof(Connectors.AzureStorageConnector)) { if (template.Connector.GetContainer().EndsWith("/")) { container = $@"{template.Connector.GetContainer()}{container}"; } else { container = $@"{template.Connector.GetContainer()}/{container}"; } } else { container = $@"{template.Connector.GetContainer()}\{container}"; } #else container = $@"{template.Connector.GetContainer()}\{container}"; #endif } } else { container = template.Connector.GetContainer(); } var stream = template.Connector.GetFileStream(fileName, container); if (stream == null) { //Decode the URL and try again fileName = WebUtility.UrlDecode(fileName); container = WebUtility.UrlDecode(container); stream = template.Connector.GetFileStream(fileName, container); } return(stream); }
/// <summary> /// Retrieves <see cref="Stream"/> from connector. If the file name contains special characters (e.g. "%20") and cannot be retrieved, a workaround will be performed /// </summary> private static Stream GetFileStream(ProvisioningTemplate template, Model.File file) { var fileName = file.Src; var stream = template.Connector.GetFileStream(fileName); if (stream == null) { //Decode the URL and try again fileName = WebUtility.UrlDecode(fileName); stream = template.Connector.GetFileStream(fileName); } return(stream); }
private static File UploadFile(ProvisioningTemplate template, Model.File file, Microsoft.SharePoint.Client.Folder folder, Stream stream) { File targetFile = null; var fileName = template.Connector.GetFilenamePart(file.Src); try { targetFile = folder.UploadFile(fileName, stream, file.Overwrite); } catch (Exception) { //The file name might contain encoded characters that prevent upload. Decode it and try again. fileName = WebUtility.UrlDecode(fileName); targetFile = folder.UploadFile(fileName, stream, file.Overwrite); } return(targetFile); }
private static File UploadFile(Web web, ProvisioningTemplate template, Model.File file, Microsoft.SharePoint.Client.Folder folder) { File targetFile = null; var fileName = template.Connector.GetFilenamePart(file.Src); try { // Replace tokens in aspx files before uploading if (fileName.EndsWith(".aspx") || fileName.EndsWith(".master") || fileName.EndsWith(".js")) { string fileString = template.Connector.GetFile(file.Src); fileString = Tokenize(web, fileString); using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(fileString))) { targetFile = folder.UploadFile(fileName, stream, file.Overwrite); } } else { using (var stream = template.Connector.GetFileStream(file.Src)) { targetFile = folder.UploadFile(fileName, stream, file.Overwrite); } } } catch (Exception) { //The file name might contain encoded characters that prevent upload. Decode it and try again. fileName = WebUtility.UrlDecode(fileName); using (var stream = template.Connector.GetFileStream(file.Src)) { targetFile = folder.UploadFile(fileName, stream, file.Overwrite); } } return(targetFile); }
/// <summary> /// Retrieves <see cref="Stream"/> from connector. If the file name contains special characters (e.g. "%20") and cannot be retrieved, a workaround will be performed /// </summary> private static Stream GetFileStream(ProvisioningTemplate template, Model.File file) { var fileName = file.Src; var container = String.Empty; if (fileName.Contains(@"\") || fileName.Contains(@"/")) { var tempFileName = fileName.Replace(@"/", @"\"); container = fileName.Substring(0, tempFileName.LastIndexOf(@"\")); fileName = fileName.Substring(tempFileName.LastIndexOf(@"\") + 1); } // add the default provided container (if any) if (!String.IsNullOrEmpty(container)) { if (!String.IsNullOrEmpty(template.Connector.GetContainer())) { container = String.Format(@"{0}\{1}", template.Connector.GetContainer(), container); } } else { container = template.Connector.GetContainer(); } var stream = template.Connector.GetFileStream(fileName, container); if (stream == null) { //Decode the URL and try again fileName = WebUtility.UrlDecode(fileName); stream = template.Connector.GetFileStream(fileName, container); } return(stream); }
/// <summary> /// Retrieves <see cref="Stream"/> from connector. If the file name contains special characters (e.g. "%20") and cannot be retrieved, a workaround will be performed /// </summary> private static Stream GetFileStream(ProvisioningTemplate template, Model.File file, TokenParser parser, Web web) { var fileName = file.Src; var fileFolder = parser.ParseString(file.Folder); var container = String.Empty; if (fileFolder.Contains(@"\") || fileFolder.Contains(@"/")) { string tempFileFolder = fileFolder.Replace(web.ServerRelativeUrl, String.Empty); container = tempFileFolder.Replace(@"/", @"\"); } // add the default provided container (if any) if (!String.IsNullOrEmpty(container)) { if (!String.IsNullOrEmpty(template.Connector.GetContainer())) { container = $@"{template.Connector.GetContainer()}\{container}"; } } else { container = template.Connector.GetContainer(); } var stream = template.Connector.GetFileStream(fileName, container); if (stream == null) { //Decode the URL and try again fileName = WebUtility.UrlDecode(fileName); stream = template.Connector.GetFileStream(fileName, container); } return(stream); }
private ProvisioningTemplate GetFileContents(Web web, ProvisioningTemplate template, string welcomePageUrl, ProvisioningTemplateCreationInformation creationInfo, PnPMonitoredScope scope) { var fullUri = new Uri(UrlUtility.Combine(web.Url, web.RootFolder.WelcomePage)); var folderPath = fullUri.Segments.Take(fullUri.Segments.Count() - 1).ToArray().Aggregate((i, x) => i + x).TrimEnd('/'); var fileName = fullUri.Segments[fullUri.Segments.Count() - 1]; var webParts = web.GetWebParts(welcomePageUrl); var file = web.GetFileByServerRelativeUrl(welcomePageUrl); var homeFile = new Model.File() { Folder = Tokenize(folderPath, web.Url), Src = fileName, Overwrite = true, }; // Add field values to file RetrieveFieldValues(web, file, homeFile); // Add WebParts to file foreach (var webPart in webParts) { var webPartxml = TokenizeWebPartXml(web, web.GetWebPartXml(webPart.Id, welcomePageUrl)); Model.WebPart newWp = new Model.WebPart() { Title = webPart.WebPart.Title, Row = (uint)webPart.WebPart.ZoneIndex, Contents = webPartxml }; #if !CLIENTSDKV15 // As long as we've no CSOM library that has the ZoneID we can't use the version check as things don't compile... if (web.Context.HasMinimalServerLibraryVersion(Constants.MINIMUMZONEIDREQUIREDSERVERVERSION)) { newWp.Zone = webPart.ZoneId; } #endif homeFile.WebParts.Add(newWp); } template.Files.Add(homeFile); // Persist file using connector if (creationInfo.PersistBrandingFiles) { PersistFile(web, creationInfo, scope, folderPath, fileName); } return template; }
private ProvisioningTemplate GetFileContents(Web web, ProvisioningTemplate template, TokenParser parser, string welcomePageUrl, ProvisioningTemplateCreationInformation creationInfo, PnPMonitoredScope scope) { var fullUri = new Uri(UrlUtility.Combine(web.Url, web.RootFolder.WelcomePage)); var folderPath = fullUri.Segments.Take(fullUri.Segments.Count() - 1).ToArray().Aggregate((i, x) => i + x).TrimEnd('/'); var fileName = fullUri.Segments[fullUri.Segments.Count() - 1]; var webParts = web.GetWebParts(welcomePageUrl); var file = web.GetFileByServerRelativeUrl(welcomePageUrl); var homeFile = new Model.File() { Folder = TokenizeUrl(folderPath, parser), Src = fileName, Overwrite = true, }; // Add field values to file //RetrieveFieldValues(web, file, homeFile); WebPartsModelProvider webpartsProvider = new WebPartsModelProvider(web); var webparts = webpartsProvider.Retrieve(welcomePageUrl, parser); homeFile.WebParts.AddRange(webparts); template.Files.Add(homeFile); // Persist file using connector if (creationInfo.PersistBrandingFiles) { PersistFile(web, creationInfo, scope, folderPath, fileName); } return template; }
private Model.File RetrieveFieldValues(Web web, File file, Model.File homeFile) { var listItem = file.EnsureProperty(f => f.ListItemAllFields); var list = listItem.ParentList; var fields = list.Fields; web.Context.Load(fields, fs => fs.IncludeWithDefaultProperties(f => f.TypeAsString, f => f.InternalName, f => f.Title)); web.Context.ExecuteQueryRetry(); var fieldValues = listItem.FieldValues; var fieldValuesAsText = listItem.EnsureProperty(li => li.FieldValuesAsText).FieldValues; var fieldstoExclude = new[] { "ID", "GUID", "Author", "Editor", "FileLeafRef", "FileRef", "File_x0020_Type", "Modified_x0020_By", "Created_x0020_By", "Created", "Modified", "FileDirRef", "Last_x0020_Modified", "Created_x0020_Date", "File_x0020_Size", "FSObjType", "IsCheckedoutToLocal", "ScopeId", "UniqueId", "VirusStatus", "_Level", "_IsCurrentVersion", "ItemChildCount", "FolderChildCount", "SMLastModifiedDate", "owshiddenversion", "_UIVersion", "_UIVersionString", "Order", "WorkflowVersion", "DocConcurrencyNumber", "ParentUniqueId", "CheckedOutUserId", "SyncClientId", "CheckedOutTitle", "SMTotalSize", "SMTotalFileStreamSize", "SMTotalFileCount", "ParentVersionString", "ParentLeafName", "SortBehavior", "_ModerationStatus" }; foreach (var fieldValue in fieldValues.Where(f => !fieldstoExclude.Contains(f.Key))) { if (fieldValue.Value != null && !string.IsNullOrEmpty(fieldValue.Value.ToString())) { var field = fields.FirstOrDefault(fs => fs.InternalName == fieldValue.Key); string value = string.Empty; if (field.TypeAsString == "URL") { value = Tokenize(fieldValuesAsText[fieldValue.Key], web.Url); } else { value = Tokenize(fieldValue.Value.ToString(), web.Url); } if (fieldValue.Key == "ContentTypeId") { // Replace the content typeid with a token var ct = list.GetContentTypeById(value); if (ct != null) { value = string.Format("{{contenttypeid:{0}}}", ct.Name); } } homeFile.Properties.Add(fieldValue.Key, value); } } return(homeFile); }