private void UpdateMetaData(IInRiverResource resource, InRiverImportResource updatedResource) { MediaData editableMediaData = (MediaData)((MediaData)resource).CreateWritableClone(); ResourceMetaField resourceFileId = updatedResource.MetaFields.FirstOrDefault(m => m.Id == "ResourceFileId"); if (resourceFileId != null && !string.IsNullOrEmpty(resourceFileId.Values.First().Data) && resource.ResourceFileId != int.Parse(resourceFileId.Values.First().Data)) { IBlobFactory blobFactory = ServiceLocator.Current.GetInstance <IBlobFactory>(); FileInfo fileInfo = new FileInfo(updatedResource.Path); if (fileInfo.Exists == false) { throw new FileNotFoundException("File could not be imported", updatedResource.Path); } string ext = fileInfo.Extension; Blob blob = blobFactory.CreateBlob(editableMediaData.BinaryDataContainer, ext); using (Stream s = blob.OpenWrite()) { FileStream fileStream = File.OpenRead(fileInfo.FullName); fileStream.CopyTo(s); } editableMediaData.BinaryData = blob; editableMediaData.RouteSegment = GetUrlSlug(updatedResource); } ((IInRiverResource)editableMediaData).HandleMetaData(updatedResource.MetaFields); _contentRepository.Save(editableMediaData, SaveAction.Publish, AccessLevel.NoAccess); }
private List <ResourceMetaField> GenerateMetaFields(Resource resource) { var metaFields = new List <ResourceMetaField>(); if (resource.ResourceFields == null) { return(metaFields); } foreach (MetaField metaField in resource.ResourceFields.MetaField) { var resourceMetaField = new ResourceMetaField { Id = metaField.Name.Value }; var values = new List <Value>(); foreach (Data data in metaField.Data) { var value = new Value { Languagecode = data.language }; if (data.Item != null && data.Item.Count > 0) { foreach (Item item in data.Item) { value.Data += item.value + ";"; } int lastIndexOf = value.Data.LastIndexOf(';'); if (lastIndexOf != -1) { value.Data = value.Data.Remove(lastIndexOf); } } else { value.Data = data.value; } values.Add(value); } resourceMetaField.Values = values; metaFields.Add(resourceMetaField); } return(metaFields); }
private MediaData CreateNewFile(InRiverImportResource inriverResource) { ResourceMetaField resourceFileId = inriverResource.MetaFields.FirstOrDefault(m => m.Id == "ResourceFileId"); if (String.IsNullOrEmpty(resourceFileId?.Values.FirstOrDefault()?.Data)) { _logger.Debug("ResourceFileId is null, won't do stuff."); return(null); } _logger.Debug($"Attempting to create and import file from path: {inriverResource.Path}"); var fileInfo = new FileInfo(inriverResource.Path); IEnumerable <Type> mediaTypes = _contentMediaResolver.ListAllMatching(fileInfo.Extension).ToList(); _logger.Debug($"Found {mediaTypes.Count()} matching media types for extension {fileInfo.Extension}."); Type contentTypeType = mediaTypes.FirstOrDefault(x => x.GetInterfaces().Contains(typeof(IInRiverResource))) ?? _contentMediaResolver.GetFirstMatching(fileInfo.Extension); if (contentTypeType == null) { _logger.Warning($"Can't find suitable content type when trying to import {inriverResource.Path}"); } else { _logger.Debug($"Chosen content type-type is {contentTypeType.Name}."); } ContentType contentType = _contentTypeRepository.Load(contentTypeType); var newFile = _contentRepository.GetDefault <MediaData>(GetFolder(fileInfo, contentType), contentType.ID); newFile.Name = fileInfo.Name; newFile.ContentGuid = EpiserverEntryIdentifier.EntityIdToGuid(inriverResource.ResourceId); // ReSharper disable once SuspiciousTypeConversion.Global if (newFile is IInRiverResource resource) { resource.ResourceFileId = Int32.Parse(resourceFileId.Values.First().Data); resource.EntityId = inriverResource.ResourceId; try { resource.HandleMetaData(inriverResource.MetaFields); } catch (Exception exception) { _logger.Error($"Error when running HandleMetaData for resource {inriverResource.ResourceId} with contentType {contentType.Name}: {exception.Message}"); } } Blob blob = _blobFactory.CreateBlob(newFile.BinaryDataContainer, fileInfo.Extension); using (Stream stream = blob.OpenWrite()) { FileStream fileStream = File.OpenRead(fileInfo.FullName); fileStream.CopyTo(stream); fileStream.Dispose(); } newFile.BinaryData = blob; _logger.Debug($"New mediadata is ready to be saved: {newFile.Name}, from path {inriverResource.Path}"); ContentReference contentReference = _contentRepository.Save(newFile, SaveAction.Publish, AccessLevel.NoAccess); var mediaData = _contentRepository.Get <MediaData>(contentReference); _logger.Debug($"Saved file {fileInfo.Name} with Content ID {contentReference?.ID}."); return(mediaData); }