C# 如何将图像从ViewModel上载到数据库
我给你发了一个链接到以前的文章在这里 现在的问题涉及图像参数的传输 我想用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] 公共异步任务
[显示(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();
返回重定向到操作(名称(索引));
}
}
...
...
模型。照片=照片;
返回视图(模型);
}