[英]Upload picture to SQL Server database using Entity Framework in ASP.NET MVC
[英]Upload multiple pictures to SQL Server database using Entity Framework in ASP.NET MVC
我一直在嘗試使用實體框架將多張圖片上傳到 SQL 服務器數據庫。
我之前已經成功將一張圖片上傳到數據庫,但我需要一次上傳多張圖片。
我嘗試將圖片作為 DtoModel 中的ICollection<IFormFile> Pic
並將它們轉換為主要 model 中的 byte[] 以將它們存儲在數據庫中,但它不起作用,我只是將一張圖片從許多我存儲在數據庫中已上傳。
初級 model:
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; }
}
Controller:
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");
}
那么,我是否需要創建一個與主 model 具有一對多關系的新映像 model? 或者有更好的方法可以實現這種方法而不將圖像存儲在 wwwroot 文件夾中?
重寫您的 controller 代碼塊,如下所示:
if (model.Pic != null )
{
// Loop thru each selected file
foreach (IFormFile photo in model.Pic)
{
var dataStream = new MemoryStream();
await photo.CopyToAsync(dataStream);
byte[] conv = dataStream.ToArray();
var pic = new property()
{
Name = model.Name,
Pic = conv,
PicFromat = model.PicFromat
};
_context.Properties.Add(pic);
}
}
_context.SaveChanges();
對於這種方法,您需要考慮以下幾點,即
確保基礎數據庫,例如 SQL 服務器的數據類型必須為VARBINARY(MAX) 。 這會將字節數組數據存儲在一行中。
看到您的代碼,我可以告訴您實際上需要多行 List<byte[]> 數據類型來將多個圖像字節存儲在單行表中。
由於您只是使用數據類型 byte[] 這意味着在您的foreach 循環中,您轉換為字節數組的最后一個圖像將存儲在您的變量中,這意味着在您的conv變量中,您存儲的是單個圖像的字節而不是多個圖像。
知道任何數據庫基礎設施都不允許將任何列表甚至字節數組存儲在單行中,您最終需要使用一個可能的數據庫關系將多個文件字節數組的列表分別存儲在多行中。
您可能已經發現了一些技巧,但隨着圖像數量的增加或圖像大小的增加,它最終會達到數據類型的最大限制。
簡而言之,您需要一對多的關系映射 model 以在數據庫中以字節存儲多個圖像,您不能通過設計將多個圖像字節數組存儲在單行中。 我希望我能夠在這里澄清一些事情。
聽起來您需要為圖像名稱“test1”和唯一 ID(主鍵)創建一個單獨的表,該 ID 將用於定位上傳到單獨表的圖像集合。
上傳需要兩次寫入,一次寫入存儲“ImageName”和唯一鍵的表,第二次寫入單獨上傳圖像,並使用將它們鏈接回“ImageName”的列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.