从模型类到数据库到IFormFile的字节图像检索问题

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

为我的API创建POST方法后,我可以将图像上传到以字节为单位的数据库中,我想创建一个GET方法,该方法将允许我获取它们的信息并最终将其显示在一个网页。

我的模型类如下:

public class Image
{
    public int recipeId { get; set; }
    public string format { get; set; }
    public string description { get; set; }
    public IFormFile image { get; set; }
}

IFormFile image是从前端上传并使用MemoryStream进行转换以填充数据库的图像,如下所示:

enter image description here

话虽如此,以下是我的GET方法:

[Route("v1/recipe/image/{recipeId}")]
[HttpGet()]
public Image GetImage(int recipeId)
{
    using (var con = _connFactory())
    {
        con.Open();
        return con.Query<Image>("SELECT * FROM RecipeImage WHERE RecipeId = @recipeId", new { recipeId }).FirstOrDefault();
    }
}

但是我收到以下错误:

System.Data.DataException:'错误分析第3列(Image = System.Byte []-Object)'

InvalidCastException:无法将类型为'System.Byte []'的对象转换为键入“ Microsoft.AspNetCore.Http.IFormFile”。

我了解这里的问题,但是我找不到任何解决方法。我想到的唯一解决方案是为Image创建另一个模型类,而不是IFormFile具有byte[],但我想知道是否有解决此问题的更好方法。

c# dapper memorystream
2个回答
1
投票
这是因为您无法将Byte数组强制转换为IFormFile

如果要获取Image对象,则首先将Byte数组加载到MemoryStream中,然后调用Image.FromMemoryStream(stream)

using (var ms = new MemoryStream(byteArrayIn)) { return Image.FromStream(ms); }

[您可能要考虑在模型中添加一个返回Image类型的附加属性,并在设置字节数组时,即在byte[]的设置器内部,将值加载到其中。

public class Image { public int recipeId { get; set; } public string format { get; set; } public string description { get; set; } private byte[] _image { get; set; } public byte[] image { get { return _image; } set { _image = value; using(var ms = new MemoryStream(byteArrayIn)) ... imageFile = Image.FromStream(ms);... } public Image imageFile { get; set; } }


1
投票
一种方法是手动映射属性

using (var con = _connFactory()) { con.Open(); return con.Query("SELECT * FROM RecipeImage WHERE RecipeId = @recipeId", new { recipeId }) .Select(x => new Image() { recipeId = x.RecipeId, format = x.Format, description = x.Description, image = new FormFile(new MemoryStream(x.Image), 0, x.Image.Length, null, "MyFile." + x.Format, "") }) .FirstOrDefault(); }

但是如果您想在网络上显示文件,可能要单独发送该文件。尝试在浏览器中导航至v1 / recipe / image / xxx端点,以查看是否加载了图像。

[Route("v1/recipe/image/{recipeId}")] [HttpGet()] public async Task<IActionResult> GetImage(int recipeId) { var data = await con.QueryAsync<byte[]>("SELECT Image FROM RecipeImage WHERE RecipeId = @recipeId", new { recipeId }) return File(new MemoryStream(data), "image/jpeg", "SomeName.jpg"); }

© www.soinside.com 2019 - 2024. All rights reserved.