モデルの準備
public class Category
{
public int CategoryId { get; set; }
public string CategoryName { get; set; }
public byte[] CategoryImage { get; set; }
}
2. View(ボタン)
単純に「登録」ボタンを押すと AllImageRegi に POST するフォームを作ります。
<form asp-action="AllImageRegi" method="post">
<button type="submit" class="btn btn-primary">全画像登録</button>
</form>
3. Controller アクション
wwwroot/images 内の PNG を読み込み、DB に保存します。
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using System.IO;
using System.Linq;
public class CategoryController : Controller
{
private readonly IWebHostEnvironment _env;
private readonly ApplicationDbContext _context;
public CategoryController(IWebHostEnvironment env, ApplicationDbContext context)
{
_env = env;
_context = context;
}
[HttpPost]
public IActionResult AllImageRegi()
{
string imageFolder = Path.Combine(_env.WebRootPath, "images");
var pngFiles = Directory.GetFiles(imageFolder, "*.png");
foreach (var filePath in pngFiles)
{
var fileName = Path.GetFileNameWithoutExtension(filePath);
var imageBytes = System.IO.File.ReadAllBytes(filePath);
var category = new Category
{
CategoryName = fileName,
CategoryImage = imageBytes
};
_context.Categories.Add(category);
}
_context.SaveChanges();
return RedirectToAction("Index");
}
}
4. ポイント
IWebHostEnvironment.WebRootPath で wwwroot の物理パスを取得Directory.GetFiles() で PNG ファイル一覧を取得File.ReadAllBytes() でバイナリ化して byte[] に格納CategoryName はファイル名から自動設定(必要に応じて変更可)- 最後に
SaveChanges() で一括登録
5. 注意点
- DB の
CategoryImage カラムは varbinary(max)(SQL Serverの場合)に設定 - 大量画像の場合は 非同期処理 (
async/await) 推奨 - 実運用では画像はDBではなくストレージに置き、パスだけ保存する方がパフォーマンス的に有利
Powered by Froala Editor