Основной веб-API ASP.Net кодирует строку в base64

Я новичок в разработке .Net Core. У меня есть модель:

public class CoreGoal
{
    [Key]
    public long CoreGoalId { get; set; }
    public string Title { get; set; }
    public string Effect { get; set; }
    public string Target_Audience { get; set; }
    public string Infrastructure { get; set; }

    public virtual ICollection<Image> Images { get; set; }

    public CoreGoal()
    {

    }
}

И модель изображения выглядит следующим образом:

public class Image
{
    [Key]
    public long ImagelId { get; set; }
    public string Base64 { get; set; }

    [ForeignKey("CoreGoalId")]
    public long CoreGoalId { get; set; }

    public Image()
    {

    }
}

Я использую шаблон репозитория. Мой репозиторий:

public interface ICoreGoalRepository
{
    void CreateCoreGoal(CoreGoal coreGoal);

}


public class CoreGoalRepository : ICoreGoalRepository
{
    private readonly WebAPIDataContext _db;

    public CoreGoalRepository(WebAPIDataContext db)
    {
        _db = db;
    }

    //Find specific
    public CoreGoal Find(long key)
    {
        return _db.CoreGoals.FirstOrDefault(t => t.CoreGoalId == key);
    }

    //Add new
    public void CreateCoreGoal(CoreGoal coreGoal)
    {
        _db.CoreGoals.Add(coreGoal);
        _db.SaveChanges();
    }

}  

И контроллер:

[Route("api/[controller]")]
public class CoreGoalController : Controller
{
    private readonly ICoreGoalRepository _coreGoalRepository;

    //Controller
    public CoreGoalController(ICoreGoalRepository coreGoalRepository) {
        _coreGoalRepository = coreGoalRepository;
    }

    [HttpGet("{id}", Name = "GetCoreGoal")]
    public IActionResult GetById(long id)
    {
        var item = _coreGoalRepository.Find(id);
        if (item == null)
        {
            return NotFound();
        }
        return new ObjectResult(item);
    }

    //Create
    [HttpPost]
    public IActionResult Create([FromBody] CoreGoal item)
    {
        if (item == null)
        {
            return BadRequest();
        }

        _coreGoalRepository.CreateCoreGoal(item);

        return CreatedAtRoute("GetCoreGoal", new { id = item.CoreGoalId }, item);
    }

}

По запросу POST для CoreGoal. При создании нового CoreGoal я хотел бы преобразовать атрибут Base64 модели изображения из строки в байт []. Я нашел это (https://adrientorris.github.io/aspnet-core/manage-base64-encoding.html) в блоге, но я не уверен, где я должен написать этот фрагмент кода.

Кто-нибудь может мне помочь?


person Thinker    schedule 06.04.2017    source источник
comment
Вопрос для меня не ясен, не могли бы вы предоставить более подробную информацию о том, что вы пытаетесь сделать, пожалуйста?   -  person Lukasz Mk    schedule 06.04.2017
comment
Итак, My CoreGoal по сути может иметь много изображений, поэтому я создал его как отдельную модель. Теперь модель изображения имеет атрибут Base64, тип которого — строка. Когда я создаю CoreGoal, я также отправляю вместе с ней строку base64, к сожалению, при сохранении в мою базу данных MySql эта большая строка обрезается наполовину. Итак, кто-то предложил мне вместо строки использовать byte[] в качестве типа данных. Но если я изменю его на байт [], мой запрос POST завершится ошибкой со статусом 400. Так что, возможно, вместо изменения его на байт [] кодировка может работать. stackoverflow.com/questions/43248760/   -  person Thinker    schedule 06.04.2017


Ответы (1)


Первоначально вы должны изменить свою модель базы данных, чтобы сохранить двоичный образ в db (также это все еще не очень хорошая идея, но пока оставьте это):

public class Image
{
   [Key]
   public long ImagelId { get; set; }
   [NotMapped]
   public string Base64 { get; set; }
   public byte[] Binary {get; set;}

   [ForeignKey("CoreGoalId")]
   public long CoreGoalId { get; set; }

   public Image()
   {

   }
}

затем вам просто нужно преобразовать изображение внутри контроллера:

[HttpPost]
public IActionResult Create([FromBody] CoreGoal item)
{
    if (item == null)
    {
        return BadRequest();
    }
    item.Binary = Convert.FromBase64String(item.Base64);
    _coreGoalRepository.CreateCoreGoal(item);
    return CreatedAtRoute("GetCoreGoal", new { id = item.CoreGoalId }, item);
}

Кстати: ваш код все еще не очень хорош. Нет необходимости использовать шаблон репозитория с ядром EF (https://www.thereformedprogrammer.net/is-the-repository-pattern-useful-with-entity-framework-core/). И вы должны ввести два слоя модели: public layer и model layer. Не следует раскрывать контракт EF Core извне.

person Sergey Shulik    schedule 11.11.2018