为我的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
进行转换以填充数据库的图像,如下所示:
话虽如此,以下是我的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[]
,但我想知道是否有解决此问题的更好方法。
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; } }
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"); }