Сегмент облачного хранилища не сохраняет два файла одновременно в рабочей среде

В процессе разработки следующий код успешно загружает файл изображения и его миниатюру с измененным размером.

private string uploadFile(IFormFile file, FileType fileType, UserDTO userDTO)
        {
            try
            {
                var storageObject = storageClient.UploadObjectAsync(
                    bucket: bucketId,
                    objectName: getUniqueFileName(userDTO.UserId, getFileType(fileType)),
                    contentType: file.ContentType,
                    source: file.OpenReadStream(),
                    options: new UploadObjectOptions { PredefinedAcl = PredefinedObjectAcl.PublicRead }
                );

                return storageObject.Result.MediaLink;
            }
            catch (Exception ex)
            {
                logger.LogError("An error ocurred while uploading file, message: " + ex.Message);
                return "";
            }
        }

    private string uploadImageThumbnail(IFormFile file, FileType fileType, UserDTO userDTO)
    {
        try
        {
            using var resourceImage = file.OpenReadStream();

            Image image = Image.FromStream(resourceImage);
            Image thumb = image.GetThumbnailImage(96, 96, () => false, IntPtr.Zero);

            thumb.Save(resourceImage, ImageFormat.Png);

            var storageObject = storageClient.UploadObjectAsync(
                bucket: bucketId,
                objectName: getUniqueFileName(userDTO.UserId, getFileType(fileType)),
                contentType: file.ContentType,
                source: resourceImage,
                options: new UploadObjectOptions { PredefinedAcl = PredefinedObjectAcl.PublicRead }
            );

            return storageObject.Result.MediaLink;
        }
        catch (Exception ex)
        {
            logger.LogError("An error ocurred while uploading file, message: " + ex.Message);
            return "";
        }
    }

Но по какой-то причине я не могу заставить это работать в производственной среде. В «производственном» сегменте успешно сохраняется только первый файл с использованием uploadFile(file, fileType, userDTO), а миниатюра — нет.

Здесь вы можете увидеть информацию об обоих сегментах, так как вы видите, что они идентичны. Ведра

Рабочая инфраструктура: приложение .NET Core 3.1 MVC, работающее в App Engine Flex

Инфраструктура в разработке: приложение .NET Core 3.1 MVC, работающее в IISExpress, объединенное в Visual Studio

Возможно, я что-то использую неправильно или App Engine Flexible по какой-то причине не может выполнять эти запросы?

Возможно, конечно, код можно улучшить, но я не понимаю, почему в разработке это работает, а в производстве — нет. ????


person Luis Mezas    schedule 20.08.2020    source источник
comment
вы получили какую-либо ошибку на Stackdriver?   -  person Jan Hernandez    schedule 20.08.2020
comment
fail: FileUploadServiceDefault[0] An error ocurred while uploading file, message: The type initializer for 'Gdip' threw an exception. Я только что увидел это, возможно, это связано с ОС, в которой App Engine Flex работает в фоновом режиме? Я использую класс System.Drawing.Image для изменения размера изображения.   -  person Luis Mezas    schedule 20.08.2020
comment
Звучит разумно, Google не предлагает оптимизированную среду выполнения для Net core 3.1, в качестве альтернативы. Если вы хотите создать миниатюру изображения, хранящегося в ведре, вы можете использовать облачную функцию для прослушивания изменений в ведре и изображения с измененным размером, как это предлагается в этом ответе   -  person Jan Hernandez    schedule 20.08.2020
comment
Спасибо, посмотрю на него   -  person Luis Mezas    schedule 21.08.2020


Ответы (1)


Для тех, кто ищет это в будущем, я решил использовать https://github.com/SixLabors/ImageSharp вместо пакета System.Drawing.Common. Похоже, что некоторые библиотеки отсутствовали для GDI+ (я не был уверен, как настроить среду Flex App Engine и загрузить на сервер некоторые необходимые библиотеки GDI+, хотя вы можете сделать это с помощью Dockerfile), и ImageSharp просто позаботится об этом. ничего не устанавливая. Я только что скачал его из NuGet с помощью Visual Studio.

Из Гитхаба:

ImageSharp — это новая, полнофункциональная, полностью управляемая кроссплатформенная библиотека 2D-графики. Созданный для упрощения обработки изображений, ImageSharp предоставляет вам невероятно мощный, но очень простой API.

person Luis Mezas    schedule 21.08.2020