如何将图像从ViewModel上传到数据库

时间:2019-11-10 15:09:41

标签: c# asp.net-mvc asp.net-core

我在这里向您发送指向上一篇文章的链接。

How to insert data from ViewModel to Database with using dropdown list in View

问题现在涉及图像参数的传输。

我想使用ViewModel将照片上传到主模型,以将数据发送到数据库。 这不是大规模传输文件,而是将单个文件传输到表中。

两个模型参数均设置为:

[Display(Name ="Photo")]
public byte[] Photo { get; set; }

我试图根据Microsoft ASP.NET Core v 2.2文档设置模型

我对控制器[HttpPost]的尝试:

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create(... , byte[] Photo, IFormFile Image)
        {
            ObjectABC abc = new ObjectABC ();
            ObjectViewModel model = new ObjectViewModel ();

            if (ModelState.IsValid)
            {
                if (... && Image != null)
                {
                    ...
                    abc.Photo = Photo;

                    _context.Add(abc);
                    await _context.SaveChangesAsync();
                    return RedirectToAction(nameof(Index));
                }
            }  

            Photo = null;

             using (var memoryStream = new MemoryStream())
             {
                 Image.CopyTo(memoryStream);
                 Photo = memoryStream.ToArray();
             }

            ...
            model.Photo = Photo;

            return View(model);
        }

对于[HttpGet]控制器,我没有进行任何设置,而是按照先前解决方案中的建议将其保留。 零件视图:

...
            <div class="form-gr">
                <input type="file" asp-for="Photo" class="form-control" />
                <label asp-for="Photo" class="control-label">Browse...</label>
                <span asp-validation-for="Photo" class="text-danger"></span>
            </div>
...

一切正常,但程序显示:

  

NullReferenceException:对象引用未设置为对象的实例。

     

...

     

+

             Image.CopyTo(memoryStream);

设置错误的地方是什么?有什么想法吗?

1 个答案:

答案 0 :(得分:0)

最终,我放弃了VARBINARY(MAX),将数据库更改为字符串以存储文件名。我知道这不太安全。但是很好用。我的解决方案:

在模型中,我从字节[]更改为字符串

控制器:

[HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create(... IFormFile Photo)
        {
            ObjectViewModel model = new ObjectViewModel ();


            if (ModelState.IsValid)
            {
                string uidFileName = null;

                if (... && Photo != null)
                {
                    string uploadFolder = Path.Combine(hostingEnvironment.WebRootPath, "images");
                    uidFileName = Guid.NewGuid().ToString() + "_" + Path.GetFileName(Photo.FileName);
                    string filePath = Path.Combine(uploadFolder, uidFileName);
                    Photo.CopyTo(new FileStream(filePath, FileMode.Create));

                    ObjectABC abc = new ObjectABC()
                    {
                        ...
                        Photo = uidFileName
                    };

                    _context.Add(abc);
                    await _context.SaveChangesAsync();
                    return RedirectToAction(nameof(Index));
                }
            }           

           ...

            ...
            model.Photo = Photo;

            return View(model);
        }