.NET Core API与ImageSharp、MemoryStream和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目前缺乏异步方法,因此需要一个变通方法。

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

该格式是从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文档上得到了404——希望这不是该项目已经倒闭的迹象。

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

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

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

最新更新