public async Task <Tour> AddAsync(Tour tour, IFormFileCollection images) { foreach (var file in images.AsEnumerable()) { using var stream = file.OpenReadStream(); string url = await _remoteFileStorageHandler.UploadAsync(stream, "jpg"); tour.ImageUrls.Add(url); } await _dbContext.AddAsync(tour); return(tour); }
public async Task <Post> AddAsync(Post post, IFormFile coverImg) { if (coverImg != null) { using var stream = coverImg.OpenReadStream(); post.CoverImgUrl = await _remoteFileStorageHandler.UploadAsync(stream, "jpg"); } _doc.LoadHtml(post.Content); var imageUrls = await _doc.ProcessBase64Images(_remoteFileStorageHandler); post.ImageUrls.AddRange(imageUrls); post.Content = _doc.DocumentNode.InnerHtml; post.LastUpdated = DateTime.Now; await _dbContext.Posts.AddAsync(post); return(post); }
// Parse images that use Base64 string for src attribute, upload to remote storage and replace src with hosted image url public static async Task <IEnumerable <string> > ProcessBase64Images(this HtmlDocument doc, IRemoteFileStorageHandler remoteFileStorageHandler) { List <string> uploadedImgUrls = new(); var imgTags = doc.DocumentNode.SelectNodes("//img"); if (imgTags != null) { foreach (var img in imgTags) { var src = img.Attributes["src"].Value; // Upload image and set src to the image url if (src.StartsWith("data:image")) { var stream = new MemoryStream(Convert.FromBase64String(src.Split(";base64,")[1])); src = await remoteFileStorageHandler.UploadAsync(stream, "jpg"); img.Attributes["src"].Value = src; } uploadedImgUrls.Add(src); } } return(uploadedImgUrls); }