我想将图片添加到Class中,但是asp.net Core迁移失败了:
错误消息:
属性Product.ImageFile
是接口类型(IFormFile
)。如果是导航属性,则通过将此属性转换为映射的实体类型来手动配置此属性的关系,否则忽略模型中的属性。
product.cs:
[Required]
[DataType(DataType.Upload)]
[FileExtensions(Extensions = "jpg,png,jpeg,bmp")]
public IFormFile ImageFile { set; get; }
我应该如何存储图片?
答案 0 :(得分:3)
如错误所述,您无法直接使用Entity Framework存储接口,您必须提供实际的实现类型。
如果你在控制器中调试并停止,你可以看到你收到的实际类型是Microsoft.AspNetCore.Http.Internal.FormFile
,所以如果你想保存它,你应该使用这种类型。
using Microsoft.AspNetCore.Http.Internal;
[....]
[....]
public FormFile ImageFile { set; get; }
但无论如何,无法将其直接保存到您的数据库中。第一个原因是因为数据可以通过此对象的方法给出的流来访问,而不是直接来自属性。实体框架不知道如何执行该操作,它只能保存属性的值。
byte[] data;
using (var stream = file.OpenReadStream())
{
data = new byte[stream.Length];
stream.Read(data, 0, (int)stream.Length);
}
现在为什么要将文件直接保存在数据库中?我建议您将文件保存在硬盘驱动器的某个位置,并将其路径保存在数据库中。
var filePath = myPhisicalOrRelativePath + "/" + file.FileName; //Be careful with duplicate file names
using (var fileStream = System.IO.File.Create(filePath))
{
await file.CopyToAsync(fileStream);
}
您的产品型号将包含属性
public string FilePath {get; set;}
然后,您必须使用FilePath
变量
Product
对象中设置属性filePath
myProduct.FilePath = filePath;
如果您确实希望将数据直接存储在数据库中而不是物理文件中,我建议您可以在Product
模型中添加所需的属性,而不是直接保存FormFile
。
public class Product
{
public int Id { get; set; }
[Required]
public byte[] FileData { get; set; }
public string FileName { get; set; }
}
//using variables of the previous code examples
myProduct.FileData = data;
myProduct.FileName = file.FileName;