.NET Core API通过ImageSharp、MemoryStream和FileStream异步保存图像上传。

问题描述 投票:0回答:1

我有一个.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 六合宝典 - 希望不是项目已经倒闭的迹象。

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

asp.net-core asynchronous filestream memorystream imagesharp
1个回答
2
投票

CopyToAsync 复制一个流从其当前位置开始。你必须改变当前位置的 memoryStream 在复制之前,先返回开始。

    // ...
    memoryStream.Seek(0, SeekOrigin.Begin);
    await memoryStream.CopyToAsync(fileStream).ConfigureAwait(false);
   // ...
© www.soinside.com 2019 - 2024. All rights reserved.