首页 > 解决方案 > 使用文件数组解析 FormData [] - 到控制器并保存到 PSQL

问题描述

再会,

有 MVC 后端 - 应该如何为这类问题设计解决方案?

所以 FE 发送这个文件数组:

FormData:[
    file0: (binary)
    file1: (binary)
    file2: (binary)
]

然后在 BE 端有 Controller

目前的解决方案将这些文件存储到文件系统。

    [AllowAnonymous]
    [HttpPost("file")]
    public async Task<ActionResult> PostAsync([FromForm] List<IFormFile> files)
    {
        long size = files.Sum(f => f.Length);
        Console.WriteLine(files);
        Console.WriteLine(size);

        foreach (var formFile in files)
        {
            if (formFile.Length > 0)
            {
                var filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", formFile.FileName);

                using var stream = System.IO.File.Create(filePath);
                await formFile.CopyToAsync(stream);
            }
        }

        // Process uploaded files
        // Don't rely on or trust the FileName property without validation.

        return Ok(new { count = files.Count, size });
    }

有一个带有该文件的模型(将来应该有更多属性)

namespace WebApi.Models
{
    public class Model
    {
        public string Name { get; set; }
        public byte[] Files { get; set; }
    }
}

问题是:如何将此二进制对象数组映射到示例模型并将此材料数据存储在数据库(postgress)中?

标签: c#.netreactjs

解决方案


听起来您的问题可以归结为两个不同的问题:

  1. 如何从 IFormFile 获取 byte[]
foreach (var formFile in files)
{
    if (formFile.Length > 0)
    {
        using var memoryStream = new MemoryStream();
        await formFile.CopyToAsync(memoryStream);
        
        var model = new Model
        {
            Name = formFile.Name,
            Files = memoryStream.ToArray()
        };
        
        // add model to database
    }
}
  1. 如何byte[]在 PostgreSQL 中保存一个?

使用Npgsql,您可以直接将byte[]C# 中的 a映射到byteaPostgreSQL 中的列。


推荐阅读