我在这里向您发送指向上一篇文章的链接。
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);
设置错误的地方是什么?有什么想法吗?
答案 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);
}