1

我有一个 .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 目前缺少异步方法,因此需要一种解决方法。

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

该格式是从 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 Save to MemoryStream 还是 MemoryStream.CopyToAsync 上。

我目前在SixLabors 文档上得到 404 - 希望这不是项目已经折叠的迹象。

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

4

1 回答 1

2

CopyToAsync从当前位置开始复制流。memoryStream您必须在复制之前将 back的当前位置更改为 start:

    // ...
    memoryStream.Seek(0, SeekOrigin.Begin);
    await memoryStream.CopyToAsync(fileStream).ConfigureAwait(false);
   // ...
于 2020-05-02T20:03:13.243 回答