尝试使用asp.net核心将文件上传到数据库

问题描述 投票:1回答:1

我正在努力使用ASP.NET Core将文件加载到数据库中。我能做错什么?

这就是我的模型中的内容

namespace BeeshoekCWPortal.Models
{
    public class CWRecords
    {

    public int Id { get; set; }

    public string RecordName { get; set; }
    public byte[] Document { get; set; }

    [DisplayFormat(DataFormatString ="{0:d}")]
    public DateTime DateAdded { get; set; }

    public int CWId { get; set; }

    [ForeignKey("CWId")]
    public virtual ContingentWorker CW { get; set; }
    }
 }

这就是我在My ViewModel中所拥有的

namespace BeeshoekCWPortal.ViewModel
{
   public class CWandRecordsViewModel
  {

    public int CWId { get; set; }
    public string Title { get; set; }
    public string FullNames { get; set; }
    public string Surname { get; set; }
    public string DateofBirth { get; set; }
    public string IdPassportNumber { get; set; }
    public string Gender { get; set; }
    public string Race { get; set; }
    public string Nationality { get; set; }
    public IFormFile Document { get; set; }

    public CWRecords NewRecordObj { get; set; }
    public IEnumerable<CWRecords> PastRecordObj { get; set; }
    }
  }

我强烈相信我在控制器中做错了什么。

    //POST : Services/Create
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Create(CWandRecordsViewModel model)

    {            
        if (ModelState.IsValid)
        {
            {
                model.NewRecordObj.CWId = model.CWId;
                model.NewRecordObj.DateAdded = DateTime.Now;
                _db.Add(model.NewRecordObj);
                await _db.SaveChangesAsync();
            };
            using (var memoryStream = new MemoryStream())
            {
                await model.Document.CopyToAsync(memoryStream);

            };
            return RedirectToAction(nameof(Create), new { CWId = model.CWId });


        }
        var CW = _db.ContingentWorkers.FirstOrDefault(c => c.Id == model.CWId);
        var newModel = new CWandRecordsViewModel
        {
            CWId = CW.Id,
            Title = CW.Title,
            FullNames = CW.FullNames,
            Surname = CW.Surname,
            DateofBirth = CW.DateofBirth,
            IdPassportNumber = CW.IdPassportNumber,
            Gender = CW.Gender,
            Race = CW.Race,
            Nationality = CW.Nationality,
            PastRecordObj = _db.CWRecords.Where(r => r.CWId == model.CWId).OrderByDescending(r => r.DateAdded).Take(5)
        };
        return View(newModel);
    }

如何修复控制器,以便我可以将文件上传到数据库。

c# asp.net-core
1个回答
1
投票

首先,您不应该在视图模型中创建要作为属性创建的新实体。您应该将它们分开,并且只在实际创建实体时创建实体。

然后,为了存储上载文件中的数据,您必须将其存储在实体中。现在,您所做的只是将数据从上传的文件复制到内存流中。然后您丢弃内存流,因此所有数据都将丢失并且永远不会到达实体或数据库(在您读取文件之前也会保存数据库更改)。

您的代码应如下所示:

if (ModelState.IsValid)
{
    var newRecordObj = new CWRecords
    {
        CWId = model.CWId,
        DateAdded = DateTime.Now,
    };

    using (var memoryStream = new MemoryStream())
    {
        await model.Document.CopyToAsync(memoryStream);
        newRecordObj.Document = memoryStream.ToArray();
    };

    _db.Add(newRecordObj);
    await _db.SaveChangesAsync();

    return RedirectToAction(nameof(Create), new { CWId = model.CWId });
}
© www.soinside.com 2019 - 2024. All rights reserved.