. NET Базовый API, сохраняющий загрузку изображений асинхронно с ImageSharp, MemoryStream и FileStream - PullRequest
0 голосов
/ 02 мая 2020

У меня есть. NET Базовый API-интерфейс, который я хотел бы расширить для асинхронного сохранения загруженных изображений.

Используя ImageSharp, я смогу проверить загрузку и изменить размер, если превышены предопределенные ограничения размера. Однако я не могу получить простое asyn c сохранение, работающее.

Простое (не асинхронное c) сохранение в файл работает без проблем:

Мой контроллер извлекает IFormFile из загрузить и вызвать следующий метод без проблем

public static void Save(IFormFile image, string imagesFolder)
{
    var fileName = Path.Combine(imagesFolder, image.FileName);

    using (var stream = image.OpenReadStream())
    using (var imgIS = Image.Load(stream, out IImageFormat format))
    {
        imgIS.Save(fileName);
    }
}

В ImageSharp в настоящее время не хватает asyn c методов , поэтому требуется обходной путь.

Обновленный код ниже сохраняет загруженный файл, но формат неправильный - при просмотре файла появляется сообщение « Похоже, мы не поддерживаем этот формат файла ».

Формат извлекается из ImageSharp Load метод. и используется при сохранении в MemoryStream.

Метод MemoryStream CopyToAsyn c используется для сохранения в FileStream, чтобы сделать загрузку асинхронной.

public static async void Save(IFormFile image, string imagesFolder)
{
    var fileName = Path.Combine(imagesFolder, image.FileName);

    using (var stream = image.OpenReadStream())
    using (var imgIS = Image.Load(stream, out IImageFormat format))
    using (var memoryStream = new MemoryStream())
    using (var fileStream = new FileStream(fileName, FileMode.OpenOrCreate))
    {      
        imgIS.Save(memoryStream, format);

        await memoryStream.CopyToAsync(fileStream).ConfigureAwait(false);
        fileStream.Flush();
        memoryStream.Close();
        fileStream.Close();
    }
}

Я не могу понять, является ли проблема с помощью ImageSharp Save to MemoryStream или MemoryStream.CopyToAsyn c.

В настоящее время я получаю 404 на Документы SixLabors - надеюсь, не является признаком того, что проект свернут.

Как сделать загрузку asyn c и сохранить в файл в правильном формате?

1 Ответ

1 голос
/ 02 мая 2020

CopyToAsync копирует поток, начиная с его текущей позиции. Вы должны изменить текущую позицию memoryStream, чтобы начать перед копированием:

    // ...
    memoryStream.Seek(0, SeekOrigin.Begin);
    await memoryStream.CopyToAsync(fileStream).ConfigureAwait(false);
   // ...
...