C# 如何将图像从ViewModel上载到数据库

C# 如何将图像从ViewModel上载到数据库,c#,asp.net-mvc,asp.net-core,C#,Asp.net Mvc,Asp.net Core,我给你发了一个链接到以前的文章在这里 现在的问题涉及图像参数的传输 我想用ViewModel将照片上载到主模型,以将数据发送到数据库。 这不是文件的大规模传输,只是将单个文件传输到表中 两个模型参数均设置为: [显示(Name=“照片”)] 公共字节[]Photo{get;set;} 我试图根据Microsoft ASP.NET Core v 2.2文档设置模型 我在控制器[HttpPost]上的尝试: [HttpPost] [ValidateAntiForgeryToken] 公共异步任务

我给你发了一个链接到以前的文章在这里

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

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

两个模型参数均设置为:

[显示(Name=“照片”)]
公共字节[]Photo{get;set;}
我试图根据Microsoft ASP.NET Core v 2.2文档设置模型

我在控制器[HttpPost]上的尝试:

[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务创建(…,字节[]照片,文件图像)
{
ObjectABC=新的ObjectABC();
ObjectViewModel模型=新的ObjectViewModel();
if(ModelState.IsValid)
{
如果(…&&Image!=null)
{
...
abc.Photo=照片;
_上下文。添加(abc);
wait_context.SaveChangesAsync();
返回重定向到操作(名称(索引));
}
}  
Photo=null;
使用(var memoryStream=new memoryStream())
{
Image.CopyTo(memoryStream);
Photo=memoryStream.ToArray();
}
...
模型。照片=照片;
返回视图(模型);
}
对于[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>
...

它在哪里设置不正确,我得到这个结果的原因是什么?有什么想法吗?

最终,我放弃了VARBINARY(MAX),将数据库更改为string来存储文件名。我知道这不太安全。但它能起作用是件好事。我的解决方案:

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

控制器:

[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);
        }
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务创建(…文件照片)
{
ObjectViewModel模型=新的ObjectViewModel();
if(ModelState.IsValid)
{
字符串uidFileName=null;
如果(…&&Photo!=null)
{
string uploadFolder=Path.Combine(hostingEnvironment.WebRootPath,“images”);
uidFileName=Guid.NewGuid().ToString()+“933;”+Path.GetFileName(Photo.FileName);
字符串filePath=Path.Combine(上传文件夹,uidFileName);
CopyTo(新文件流(filePath,FileMode.Create));
ObjectABC=新的ObjectABC()
{
...
照片=uidFileName
};
_上下文。添加(abc);
wait_context.SaveChangesAsync();
返回重定向到操作(名称(索引));
}
}           
...
...
模型。照片=照片;
返回视图(模型);
}

最终,我放弃了VARBINARY(MAX),将数据库更改为string来存储文件名。我知道这不太安全。但它能起作用是件好事。我的解决方案:

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

控制器:

[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);
        }
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务创建(…文件照片)
{
ObjectViewModel模型=新的ObjectViewModel();
if(ModelState.IsValid)
{
字符串uidFileName=null;
如果(…&&Photo!=null)
{
string uploadFolder=Path.Combine(hostingEnvironment.WebRootPath,“images”);
uidFileName=Guid.NewGuid().ToString()+“933;”+Path.GetFileName(Photo.FileName);
字符串filePath=Path.Combine(上传文件夹,uidFileName);
CopyTo(新文件流(filePath,FileMode.Create));
ObjectABC=新的ObjectABC()
{
...
照片=uidFileName
};
_上下文。添加(abc);
wait_context.SaveChangesAsync();
返回重定向到操作(名称(索引));
}
}           
...
...
模型。照片=照片;
返回视图(模型);
}