.NET Core API 使用 ImageSharp、MemoryStream 和 FileStream 异步保存图像上传

.NET Core API saving image upload asynchronously with ImageSharp, MemoryStream and FileStream

我有一个 .NET Core API,我想对其进行扩展以异步保存上传的图像。

使用 ImageSharp 我应该能够检查上传并在超过预定义的大小限制时调整大小。但是我无法进行简单的异步保存工作。

简单(非异步)保存到文件没有问题:

我的控制器从上传中提取 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 async methods,因此需要解决方法。

下面更新的代码保存了上传的文件,但格式不正确 - 查看文件时我收到消息“看来我们不支持此文件格式”。

格式是从 ImageSharp Load 方法中提取的。并在保存到 MemoryStream 时使用。

使用MemoryStream CopyToAsync方法保存到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 保存到 MemoryStream 还是 MemoryStream.CopyToAsync。

我目前在 SixLabors docs 上收到 404 - 希望这不是该项目已关闭的迹象。

如何使上传异步并以正确的格式保存到文件?

CopyToAsync 从当前位置开始复制流。在复制之前,您必须将 memoryStream 的当前位置改回起始位置:

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