我有一个.NET Core API,我想扩展它来异步保存上传的图片。
使用ImageSharp,我应该能够检查上传并在超过预定义大小限制时调整大小。然而,我不能让一个简单的异步保存工作。
一个简单的(非异步)保存到文件的工作没有问题。
我的Controller从上传中提取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的问题。
我目前得到的是404 六合宝典 - 希望不是项目已经倒闭的迹象。
如何使上传异步并以正确的格式保存到文件?
CopyToAsync
复制一个流从其当前位置开始。你必须改变当前位置的 memoryStream
在复制之前,先返回开始。
// ...
memoryStream.Seek(0, SeekOrigin.Begin);
await memoryStream.CopyToAsync(fileStream).ConfigureAwait(false);
// ...