Измените IFormFile перед загрузкой в ​​хранилище BLOB-объектов - PullRequest
0 голосов
/ 13 января 2020

В настоящее время я загружаю список изображений в azure хранилище BLOB-объектов с помощью указанной ниже функции (затем путь сохраняется в БД).

Все это работает нормально, однако, если изображения больше определенного разрешения, я хочу изменить их размер, чтобы уменьшить размер файла изображения (очевидно, это будет.

Я нашел примеры обрезки 'Image', однако, поскольку это список IFormFile (из входного типа = upload), он, похоже, не работает так же. Я попытался преобразовать IFormFile в изображение и затем изменить его размер, однако Затем я не могу преобразовать обратно в IFormFile.

Любая помощь или указатели будут отличными. Спасибо.

public async Task UploadImagesAsync(IFormFileCollection files, int VehicleID)
    {
        var connectionString = _configuration.GetConnectionString("AzureStorageAccount");
        var container = _uploadService.GetBlobContainer(connectionString);

        foreach (var file in files)
        {
            // Resize file here


            // parse the content disposition header
            var contentDisposition = ContentDispositionHeaderValue.Parse(file.ContentDisposition);

            // grab file name
            var fileName = "Vehicles/" + VehicleID + "/" + contentDisposition.FileName.Trim('"');

            // get reference
            var blockBlob = container.GetBlockBlobReference(fileName);

            // upload
            await blockBlob.UploadFromStreamAsync(file.OpenReadStream());

1 Ответ

0 голосов
/ 14 января 2020

Согласно моим исследованиям, мы можем использовать SixLabors , чтобы изменить размер изображения в приложении. Например

public async Task UploadImagesAsync(IFormFileCollection files, int VehicleID)
    {

       foreach (var file in files)
        {
       var extension = Path.GetExtension(file.FileName);
                    var encoder = GetEncoder(extension);
        if (encoder != null)
                    {

                        using (var output = new MemoryStream())
                        using (Image<Rgba32> image = Image.Load(input))
                        {
                            var divisor = image.Width / thumbnailWidth;
                            var height = Convert.ToInt32(Math.Round((decimal)(image.Height / divisor)));

                            image.Mutate(x => x.Resize(thumbnailWidth, height));
                            image.Save(output, encoder);
                            output.Position = 0;
                            await blockBlob.UploadFromStreamAsync(output);
                        }
      }
   }
}


private static IImageEncoder GetEncoder(string extension)
        {
            IImageEncoder encoder = null;

            extension = extension.Replace(".", "");

            var isSupported = Regex.IsMatch(extension, "gif|png|jpe?g", RegexOptions.IgnoreCase);

            if (isSupported)
            {
                switch (extension)
                {
                    case "png":
                        encoder = new PngEncoder();
                        break;
                    case "jpg":
                        encoder = new JpegEncoder();
                        break;
                    case "jpeg":
                        encoder = new JpegEncoder();
                        break;
                    case "gif":
                        encoder = new GifEncoder();
                        break;
                    default:
                        break;
                }
            }
...