.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);
// ...
我有一个 .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);
// ...