categoryid (int, 主キー)categoryname (string)ImageUrl (string, 相対パス)
- 管理画面から ボタン1つ で登録処理を実行できる
- Controller + View も作成
以下は 完全に動作するサンプルコード です。
(EF Core + ASP.NET Core MVC 前提、.NET 6/7/8 で動作可)
1. モデルクラス SubjectName.cs
using System.ComponentModel.DataAnnotations;
public class SubjectName
{
[Key]
public int CategoryId { get; set; }
[Required]
[MaxLength(100)]
public string CategoryName { get; set; } = string.Empty;
[Required]
public string ImageUrl { get; set; } = string.Empty;
}
2. ApplicationDbContext.cs
using Microsoft.EntityFrameworkCore;
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
public DbSet<SubjectName> SubjectNames { get; set; }
}
3. コントローラー AdminController.cs
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using System.IO;
using System.Linq;
public class AdminController : Controller
{
private readonly ApplicationDbContext _context;
private readonly IWebHostEnvironment _env;
public AdminController(ApplicationDbContext context, IWebHostEnvironment env)
{
_context = context;
_env = env;
}
// 管理画面トップ
public IActionResult Index()
{
return View();
}
// ボタン押下で実行
[HttpPost]
public IActionResult ImportImages()
{
try
{
string imagesPath = Path.Combine(_env.WebRootPath, "images");
if (!Directory.Exists(imagesPath))
{
TempData["Message"] = "images フォルダが存在しません。";
return RedirectToAction("Index");
}
var pngFiles = Directory.GetFiles(imagesPath, "*.png");
if (pngFiles.Length == 0)
{
TempData["Message"] = "PNGファイルが見つかりません。";
return RedirectToAction("Index");
}
foreach (var file in pngFiles)
{
string fileName = Path.GetFileName(file);
string relativePath = $"/images/{fileName}";
// 既に登録済みかチェック
if (!_context.SubjectNames.Any(s => s.ImageUrl == relativePath))
{
var subject = new SubjectName
{
CategoryName = Path.GetFileNameWithoutExtension(fileName),
ImageUrl = relativePath
};
_context.SubjectNames.Add(subject);
}
}
_context.SaveChanges();
TempData["Message"] = "画像をDBに登録しました。";
}
catch (Exception ex)
{
TempData["Message"] = $"エラー: {ex.Message}";
}
return RedirectToAction("Index");
}
}
4. ビュー Views/Admin/Index.cshtml
@{
ViewData["Title"] = "画像登録管理";
}
<h2>画像登録管理</h2>
@if (TempData["Message"] != null)
{
<div style="color: green;">@TempData["Message"]</div>
}
<form asp-action="ImportImages" method="post">
<button type="submit" class="btn btn-primary">wwwroot/images の PNG を登録</button>
</form>
5. Program.cs(または Startup.cs)
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
// DbContext 設定(例: SQLite)
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("DefaultConnection")));
builder.Services.AddControllersWithViews();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Admin}/{action=Index}/{id?}");
app.Run();
6. appsettings.json の接続文字列例
{
"ConnectionStrings": {
"DefaultConnection": "Data Source=app.db"
}
}
動作の流れ
wwwroot/images に PNG ファイルを置く- 管理画面
/Admin/Index にアクセス - 「wwwroot/images の PNG を登録」ボタンを押す
- 新規 PNG ファイルが
SubjectName テーブルに登録される(既存はスキップ)
このコードは 既存の画像を重複登録しない ようにしており、
管理画面からワンクリックで登録できます。
Powered by Froala Editor