Веб-API конвертирует байтовый массив в base64 для каждого запроса - PullRequest
1 голос
/ 16 июня 2020

У меня есть несколько методов, в которых я возвращаю запрос, и проблема в том, что FileContent возвращает массив байтов. Я не хочу преобразовывать массив байтов в base64 при каждом моем запросе. Есть ли способ применить преобразование в каждом методе веб-API, чтобы мне не нужно было об этом беспокоиться?

До этого я сохранял каждый файл как строку base64 в моей базе данных, но я читал, что он будет занимать больше места, чем обычно. Поэтому я решил изменить его на массив байтов, но я не знаю, как решить эту проблему.

public class File
{
    public int FileId { get; set; }

    public string FileName { get; set; }

    public byte[] FileContent { get; set; }

    public Advertentie Advertentie { get; set; }

    public int AdvertentieId { get; set; }

}

public IActionResult Row([FromRoute] int id)
{
    var advertentie = db.Advertenties.Include(x => x.Files).Where(a => a.Id == id).FirstOrDefault();
    // So here each advertentie can contain multiple files, how to convert FileContent to base64 so that every file becomes base64 and return advertentie.
    if(advertentie == null)
    {
        return NotFound();
    }
    return Ok(advertentie);
}

1 Ответ

1 голос
/ 16 июня 2020

У вас есть несколько вариантов:

  1. Расширить существующий FileModel свойством только для получения. Вы также можете сделать это в режиме ленивой загрузки.
public byte[] FileContent { get; set; }
public string FileContentString { get { return Convert.ToBase64String(FileContent); } }

В зависимости от того, какой сериализатор вы используете (например, Newtonsoft. Json), вы можете переопределить способ сериализации свойств. Вы можете, например, игнорировать или преобразовать определенные свойства.

Реализовать custom ActionResult

public class Base64Result : ActionResult
{
        private File _file;
        public Base64Result(File file)
        {
           _file = file;
        }

        public override async Task ExecuteResultAsync(ActionContext context)
        {            
            // Do the bas64 magic here (use _file to build a response)
        }
}

, а затем

public Base64Result Row([FromRoute] int id)
{
   // ...
   return new Base64Result(file);
}
Вы можете создать «модель представления» со свойствами желаемого типа, заполнить их и использовать automapper , чтобы позаботиться об остальных свойствах.

Вариантов масса.

...