Ошибка получения изображения в байтах из базы данных в IFormFile из класса модели - PullRequest
1 голос
/ 04 октября 2019

После создания метода POST для моего API, который позволяет загружать изображения в базу данных, где я храню их как байты, я хотел создать метод 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[], но мне было интересно, есть ли лучший способ решения этой проблемы.

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Одним из способов будет сопоставление свойств вручную

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");  
  }
1 голос
/ 04 октября 2019

Это потому, что вы не можете привести байтовый массив к IFormFile.

Если вы хотите получить объект Image, вы сначала загрузите массив байтов в 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; }
}
...