Skip to content

Instantly share code, notes, and snippets.

@ivakhnov
Created August 19, 2021 08:39
Show Gist options
  • Select an option

  • Save ivakhnov/e3d76196c91c23a41ff4975904f38b8b to your computer and use it in GitHub Desktop.

Select an option

Save ivakhnov/e3d76196c91c23a41ff4975904f38b8b to your computer and use it in GitHub Desktop.
[UploadApiService]
using Microsoft.WindowsAzure.Storage.Blob;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
using PNG.ContentHub.GifConversion.Utils;
using PNG.ContentHub.GifConversion.Helpers;
using Microsoft.Extensions.Logging;
namespace PNG.ContentHub.GifConversion.Services
{
internal class UploadApiService
{
private const string RequestUploadUrl = "api/v1.0/upload";
private const string UploadAlternativeFileUrl = "api/v1.0/upload/assets/{0}/alternative";
private const string GifContentType = "image/gif";
private readonly ILogger _logger;
private string _fileSize;
private string _fileName;
private byte[] _fileAsByteArray;
public UploadApiService(Uri gifUrl, string fileName, ILogger logger)
{
_fileName = fileName;
_fileAsByteArray = gifUrl.ToByteArray();
_fileSize = _fileAsByteArray.Length.ToString();
_logger = logger;
}
internal async Task SetAlternativeFileToAsset(long entityId)
{
var client = MConnector.Client.Raw;
//First step
try
{
HttpResponseMessage uploadUrlResponse;
uploadUrlResponse = await client.SendAsync(GetUploadUrlRequestMessage);
_logger.LogTrace($"Upload Url request has been sent");
uploadUrlResponse.EnsureSuccessStatusCode();
var uploadUrlResponseBody = JObject.Parse(await uploadUrlResponse.Content.ReadAsStringAsync());
//Retrieving direct url for Azure BlockBlob location
var uploadUrl = uploadUrlResponse.Headers.Location;
_logger.LogDebug($"Upload Url response body is: {uploadUrlResponseBody}");
_logger.LogTrace($"Upload Url is: {uploadUrl}");
//Second step is to upload Gif url into Azure
var cloudBlockBlob = new CloudBlockBlob(uploadUrl);
cloudBlockBlob.Properties.ContentType = GifContentType;
cloudBlockBlob.Metadata.Add("Filename", _fileName);
await cloudBlockBlob.UploadFromStreamAsync(new MemoryStream(_fileAsByteArray));
_logger.LogDebug($"'{_fileName}' file has been uploaded to Azure Blob Storage: {uploadUrlResponseBody}");
//Third step is to update alternative file
var json = JsonConvert.SerializeObject(uploadUrlResponseBody);
var httpContent = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
var alternativeFileUrlWithId = string.Format(UploadAlternativeFileUrl, entityId);
var uploadAlternativeFileResponse = await client.PostAsync($"{AppSettings.Host}{alternativeFileUrlWithId}", httpContent);
uploadAlternativeFileResponse.EnsureSuccessStatusCode();
var uploadAlternativeFileResponseBody = JObject.Parse(await uploadAlternativeFileResponse.Content.ReadAsStringAsync());
_logger.LogDebug($"Upload alternative file request has been sent. Response status is: {uploadAlternativeFileResponse.StatusCode}");
_logger.LogInformation($"Upload alternative file is finished.\nResponse is: {uploadAlternativeFileResponseBody}");
}
catch (Exception e)
{
_logger.LogError($"Error during alternative file update. Exception: {e.Message}");
_logger.LogError($"{e.StackTrace}");
}
}
private HttpRequestMessage GetUploadUrlRequestMessage()
{
var uploadUrlRequest = new HttpRequestMessage(HttpMethod.Post, $"{AppSettings.Host}{RequestUploadUrl}");
uploadUrlRequest.Content = new FormUrlEncodedContent(new Dictionary<string, string>
{
{ "fileName", _fileName },
{ "fileSize", _fileSize }
});
return uploadUrlRequest;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment