Web Api 将每个查询的字节数组转换为 base64

Web Api convert byte array to base64 for every query

我有多种方法,其中我 return 一个查询,问题是 FileContent return 是一个字节数组。我不想在我发出的每个请求中都将字节数组转换为 base64。有没有办法在每个网络 api 方法中应用转换,这样我就不必担心了?

在此之前,我将每个文件都保存为我的数据库中的 base64 字符串,但我了解到它会比正常消耗更多 space。所以我决定把它改成字节数组,但我不知道如何解决这个问题。

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. 使用仅获取 属性 扩展现有的 FileModel。您也可以以延迟加载的方式执行此操作。
public byte[] FileContent { get; set; }
public string FileContentString { get { return Convert.ToBase64String(FileContent); } }
  1. 根据您使用的序列化程序(例如 Newtonsoft.Json),您可以覆盖属性的序列化方式。你可以例如ignore or convert 某些属性。

  2. 实施customActionResult

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);
}
  1. 您可以创建具有所需类型属性的 "view-model",填充它们,然后使用 automapper 处理其余属性。

有很多选择。