【发布时间】:2022-08-16 14:55:20
【问题描述】:
我一直在尝试使用实体框架将多张图片上传到 SQL Server 数据库。
我之前已经成功将一张图片上传到数据库,但我需要一次上传多张图片。
我尝试在 DtoModel 中将图片作为ICollection<IFormFile> Pic 拍摄,并将它们转换为主要模型中的 byte[] 以将它们存储在数据库中,但它没有用,我只是将一张图片存储在我拥有的许多数据库中上传。
主要型号:
public class property
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
[Required(ErrorMessage = \"Photo is required.\")]
public byte[] Pic { get; set; }
public string PicFromat { get; set; }
}
模型:
public class dtoprop
{
public string Name { get; set; }
public ICollection<IFormFile> Pic { get; set; }
public string PicFromat { get; set; }
}
控制器:
private readonly ApplicationDbContext _context;
private new List<string> _allowedExtenstions = new List<string> { \".jpg\", \".png\" };
private long _maxAllowedPosterSize = 1048576;
public propertiesController(ApplicationDbContext context)
{
_context = context;
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create( dtoprop model)
{
if (!ModelState.IsValid)
{
return View( model);
}
if(!_allowedExtenstions.Contains(Path.GetExtension(model.Pics.FileName.ToLower())))
{
ModelState.AddModelError(\"Pic\", \"Only .PNG, .JPG images are allowed!\");
return View(model);
}
if (model.Pics.Length > _maxAllowedPosterSize)
{
ModelState.AddModelError(\"Pic\", \"Poster cannot be more than 1 MB!\");
return View(model);
}
using var dataStream = new MemoryStream();
await model.Pics.CopyToAsync(dataStream);
using var dataStream = new MemoryStream();
byte[] conv = null;
if (model.Pic != null )
{
// Loop thru each selected file
foreach (IFormFile photo in model.Pic)
{
await photo.CopyToAsync(dataStream);
conv = dataStream.ToArray();
}
}
var pic = new property
{
Name = model.Name,
Pic = conv,
PicFromat = model.PicFromat
};
_context.Properties.Add(pic);
_context.SaveChanges();
return RedirectToAction(\"Index\");
}
那么,我是否需要创建一个与主模型具有一对多关系的新图像模型?或者有更好的方法可以实现这种方法而不将图像存储在 wwwroot 文件夹中?
-
您似乎将所有文件字节附加到一个流中。您需要为每个
IFormFile创建一个_context.Properties.Add(pic);.... -
@JeremyLakeman 你能回答你的建议吗?
-
您是否有理由将二进制文件存储在您的数据库表中而不是某处的大容量存储中?在RDBMS中存储图像会引入瓶颈并引入其他问题(因此为什么MS最近添加了
FILESTREAM,但它几乎不是灵丹妙药),所以通常最好不是将文件存储在数据库中。 -
看起来您需要在循环内添加,还要确保每次都为字节数组实例化变量,而不是像建议的那样追加。探索的另一个选项是直接使用 InputStream,它应该已经有一个可以使用的字节数组列表。我认为他们曾经将其称为 InputStream,但这已在 .net 核心中进行了更改。
-
@Dai我知道,我想知道这种方法
标签: c# asp.net asp.net-mvc asp.net-core asp.net-web-api