public void ProcessImage(SourceFileUploadedMessage message) { string extension = Path.GetExtension(message.SourceFileName); if (!FileRasterizer.Supports(extension)) { var error = $"Unsupported file type {extension}"; new ProcessingInfo { FileDescriptorId = message.ImageDescriptorId, ProcessingError = error }.SaveTo(_repository); Log.Information(error); return; } var format = _options.ImageFormat.ParseImageFormat(); var imageBlobId = Guid.NewGuid().Encode(); var imageFileName = $"{imageBlobId}.{format}"; var rasterizer = new FileRasterizer(); var sourceTempFilePath = Path.Combine(Environment.CurrentDirectory, Guid.NewGuid().Encode()); try { using (var sourceStream = File.Create(sourceTempFilePath)) { Log.Information($"Loading source {message.SourceDescriptorId}"); _repository.LoadStream(message.SourceBlobId, sourceStream); Log.Information($"Rasterizing source {message.SourceDescriptorId}"); sourceStream.Position = 0; var image = rasterizer.Rasterize(sourceStream, extension); image = image.Scale(message.ImageSize.Width, message.ImageSize.Height); Log.Information($"Saving image file {message.ImageDescriptorId} as {format}"); using (var imageStream = new MemoryStream()) { var imageData = image.Convert(format); imageStream.Write(imageData, 0, imageData.Length); _repository.SaveStream(imageBlobId, imageStream); new FileDescriptor { DescriptorId = message.ImageDescriptorId, FileName = imageFileName, BlobId = imageBlobId }.SaveTo(_repository); _repository.SetExpiration(message.ImageDescriptorId, message.SourceExpiry); _repository.SetStreamExpiration(imageBlobId, message.SourceExpiry); _repository.Delete(message.ProcessingInfoId); } Log.Information($"Image {message.ImageDescriptorId} processed"); } } catch (Exception ex) { var error = $"Processing exception for source {message.SourceDescriptorId}: {ex.ToString()}"; new ProcessingInfo { FileDescriptorId = message.ImageDescriptorId, ProcessingError = error }.SaveTo(_repository); Log.Information(error); } finally { if (File.Exists(sourceTempFilePath)) { File.Delete(sourceTempFilePath); } } }
public async Task Consume(ConsumeContext <GenerateImage> context) { try { var blobInfo = await _blobStorage.GetFileInfo(context.Message.BlobId, context.Message.Bucket); string extension = Path.GetExtension(blobInfo.FileName); if (!FileRasterizer.Supports(extension)) { throw new InvalidDataException($"Unsupported file type {extension}"); } using (var stream = new MemoryStream()) { await _blobStorage.DownloadFileToStreamAsync(context.Message.BlobId, stream, context.Message.Bucket); stream.Position = 0; byte[] imageBytes; if (context.Message.Image.Format.ToLower() != "svg") { var format = context.Message.Image.Format.ParseImageFormat(); var rasterizer = new FileRasterizer(); Log.Information($"Rasterizing source '{context.Message.BlobId}'"); var image = rasterizer.Rasterize(stream, extension); image = image.Scale(context.Message.Image.Width, context.Message.Image.Height); imageBytes = image.Convert(format); } else { string data = System.Text.Encoding.ASCII.GetString(stream.ToArray()); switch (extension.ToLower()) { case ".mol": imageBytes = new IndigoAdapter().Mol2Image(data, context.Message.Image.Format, context.Message.Image.Width, context.Message.Image.Height); break; case ".rxn": imageBytes = new IndigoAdapter().Rxn2Image(data, context.Message.Image.Format, context.Message.Image.Width, context.Message.Image.Height); break; default: throw new InvalidDataException($"Unsupported file type {extension} for {context.Message.Image.Format} generation"); } } Log.Information($"Saving image file {context.Message.Image.Id} as {context.Message.Image.Format}"); await _blobStorage.AddFileAsync( id : context.Message.Image.Id, fileName : $"{blobInfo.FileName}.{$"{context.Message.Image.Format}".ToLower()}", source : imageBytes, contentType : $"{context.Message.Image.Format}".GetMimeType(), bucketName : context.Message.Bucket, metadata : new Dictionary <string, object> { { "SourceId", context.Message.BlobId } } ); Log.Information($"Image file {context.Message.Image.Id} as {context.Message.Image.Format} saved."); } context.Message.Image.MimeType = context.Message.Image.Format.GetMimeType(); await context.Publish <ImageGenerated>(new { Id = context.Message.Id, Bucket = context.Message.Bucket, BlobId = context.Message.BlobId, Image = context.Message.Image, CorrelationId = context.Message.CorrelationId, UserId = context.Message.UserId, TimeStamp = DateTimeOffset.UtcNow }); } catch (Exception e) { context.Message.Image.Exception = e.Message; await context.Publish <ImageGenerationFailed>(new { Id = context.Message.Id, Image = context.Message.Image, CorrelationId = context.Message.CorrelationId, UserId = context.Message.UserId, TimeStamp = DateTimeOffset.UtcNow }); } }