C# 将图像上载到数据库返回null或错误
几个小时以来,我一直在尝试编写一个允许将照片上载到数据库的代码,但要么没有向数据库添加任何内容,要么导致错误: [filename]值无效 我的Restauracja.cs文件:C# 将图像上载到数据库返回null或错误,c#,asp.net,entity-framework,asp.net-core,C#,Asp.net,Entity Framework,Asp.net Core,几个小时以来,我一直在尝试编写一个允许将照片上载到数据库的代码,但要么没有向数据库添加任何内容,要么导致错误: [filename]值无效 我的Restauracja.cs文件: [Required(ErrorMessage = "Wybierz plik")] [MaxLength(30, ErrorMessage = "vxvxcvcxvxxx")] [Display(Name = "Zdjecia")] public string LinkZdjecia { get; set; } [D
[Required(ErrorMessage = "Wybierz plik")]
[MaxLength(30, ErrorMessage = "vxvxcvcxvxxx")]
[Display(Name = "Zdjecia")]
public string LinkZdjecia { get; set; }
[Display(Name = "Zdjecia")]
public byte[] Photo { get; set; }
控制器餐厅cjacontroller.cs:
public class RestauracjaController : Controller
{
private readonly FirmaContext _context;
public RestauracjaController(FirmaContext context)
{
_context = context;
}
public async Task<IActionResult> Create(Restauracja restauracja, List<IFormFile> Photo)
{
foreach (var item in Photo)
{
if (item.Length > 0)
{
using (var stream = new MemoryStream())
{
await item.CopyToAsync(stream);
restauracja.Photo = stream.ToArray();
}
}
}
return View(restauracja);
}
}
<form asp-action="Create">
<div class="form-group">
<label asp-for="LinkZdjecia" class="control-label"></label>
<input asp-for="LinkZdjecia" class="form-control" />
<span asp-validation-for="LinkZdjecia" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Photo" class="control-label"></label>
<input name="Image" id="Imageinput" class="form-control" type="file" />
<span asp-validation-for="Photo" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Create" class="btn btn-primary" />
</div>
</form>
public async Task<IActionResult> Create(Restauracja restauracja, IFormFile Image)
{
if (ModelState.IsValid)
{
using (var ms = new MemoryStream())
{
Image.CopyTo(ms);
restauracja.Photo = ms.ToArray();
}
_context.Add(restauracja);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(restauracja);
}
请尝试以下代码:
public class RestauracjaController : Controller
{
private readonly FirmaContext _context;
public RestauracjaController(FirmaContext context)
{
_context = context;
}
public async Task<IActionResult> Create(Restauracja restauracja, List<IFormFile> Photo)
{
foreach (var item in Photo)
{
if (item.Length > 0)
{
byte[] result = null;
using (var readStream = item.OpenReadStream())
using (var stream = new MemoryStream())
{
readStream.CopyTo(stream);
result = readStream.ToArray();
//restauracja.Photo = result;
//_context.Add(restauracja);
}
}
}
return View(restauracja);
}
公共类餐厅cja控制器:控制器
{
私有只读FirmaContext\u上下文;
公共餐厅cjacontroller(FirmaContext上下文)
{
_上下文=上下文;
}
公共异步任务创建(Restauracja Restauracja,列表照片)
{
foreach(照片中的var项目)
{
如果(item.Length>0)
{
字节[]结果=空;
使用(var readStream=item.OpenReadStream())
使用(var stream=new MemoryStream())
{
readStream.CopyTo(流);
结果=readStream.ToArray();
//restauracja.Photo=结果;
//_添加(restauracja);
}
}
}
返回视图(restauracja);
}
}请尝试以下代码:
public class RestauracjaController : Controller
{
private readonly FirmaContext _context;
public RestauracjaController(FirmaContext context)
{
_context = context;
}
public async Task<IActionResult> Create(Restauracja restauracja, List<IFormFile> Photo)
{
foreach (var item in Photo)
{
if (item.Length > 0)
{
byte[] result = null;
using (var readStream = item.OpenReadStream())
using (var stream = new MemoryStream())
{
readStream.CopyTo(stream);
result = readStream.ToArray();
//restauracja.Photo = result;
//_context.Add(restauracja);
}
}
}
return View(restauracja);
}
公共类餐厅cja控制器:控制器
{
私有只读FirmaContext\u上下文;
公共餐厅cjacontroller(FirmaContext上下文)
{
_上下文=上下文;
}
公共异步任务创建(Restauracja Restauracja,列表照片)
{
foreach(照片中的var项目)
{
如果(item.Length>0)
{
字节[]结果=空;
使用(var readStream=item.OpenReadStream())
使用(var stream=new MemoryStream())
{
readStream.CopyTo(流);
结果=readStream.ToArray();
//restauracja.Photo=结果;
//_添加(restauracja);
}
}
}
返回视图(restauracja);
}
}正如@T.S.在对您的问题的第一条评论中所说,您的代码有很多潜在的问题,因此,如果不进行完整的代码审查,就很难回答,因为这超出了您的范围。以下是我可以看到的一些问题:
Photo
的类型应该是ifformfile
而不是byte[]
创建
操作需要第二个参数列表照片
?如果需要多个图像,请将makeRestauracja.Photo
更改为IEnumerable
,并删除Create
中的第二个参数。但现在,从一个图像开始,让它工作,然后尝试将其更改为多个图像输入
名称图像
?模型中没有这样的属性。将其更改为Photo
并使用标记帮助器<input asp-for="Photo" class="form-control" />
还有其他问题,但是上面的问题会让你继续。就像@T.S.在对你的问题的第一次评论中所说的,你的代码有很多潜在的问题,因此如果不进行全面的代码审查就很难回答,因为这超出了范围。以下是我可以看到的一些问题:
Photo
的类型应该是ifformfile
而不是byte[]
创建
操作需要第二个参数列表照片
?如果需要多个图像,请将makeRestauracja.Photo
更改为IEnumerable
,并删除Create
中的第二个参数。但现在,从一个图像开始,让它工作,然后尝试将其更改为多个图像输入
名称图像
?模型中没有这样的属性。将其更改为Photo
并使用标记帮助器<input asp-for="Photo" class="form-control" />
还有其他问题,但上面的问题会让您继续。这个问题听起来像是“这是我所有的代码,出了什么问题?”。请专注于导致错误的特定部分。我在控制器中创建breakpint和create方法,Photo为null。但我不知道why@JohnMeek谢谢,它解决了我的问题这个问题听起来像,“这是我所有的代码,怎么了?”。请专注于导致错误的特定部分。我在控制器中创建breakpint和create方法,Photo为null。但我不知道why@JohnMeek谢谢,它解决了我的问题我可以在数据库照片类型文件中创建吗?不,模型
Restauracja
用于视图,而不是数据库。IFormFile
用于将文件上载到服务器。然后,Create
操作获取ifformfile
并将其转换为字节数组以保存在数据库中。不要直接在数据库中使用视图模型,因为视图与数据库有不同的需求。因此,您需要为数据库创建另一个模型,并且在创建
操作中,您将Restauracja
模型转换为数据库模型,然后将其传递到\u上下文
。我可以在数据库照片类型文件中创建吗?不,模型Restauracja
用于视图,而不是数据库。IFormFile
用于将文件上载到服务器。然后,Create
操作获取ifformfile
并将其转换为字节数组以保存在数据库中。不要直接在数据库中使用视图模型,因为视图与数据库有不同的需求。因此,您需要数据库的另一个模型,并且在创建
操作中,您将Restauracja
模型转换为数据库模型,然后将其传递给\u上下文
。