記事詳細


投稿日
2025年12月15日01時07分
タイトル

wwwroot/images フォルダにある複数の PNG ファイルをスキャン それらを ApplicationDbContext 経由で SubjectName テーブルに登録

内容

    • categoryid (int, 主キー)
    • categoryname (string)
    • ImageUrl (string, 相対パス)
  • 管理画面から ボタン1つ で登録処理を実行できる
  • Controller + View も作成

以下は 完全に動作するサンプルコード です。
(EF Core + ASP.NET Core MVC 前提、.NET 6/7/8 で動作可)

1. モデルクラス SubjectName.cs

Csharp
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

Csharp
using Microsoft.EntityFrameworkCore; public class ApplicationDbContext : DbContext { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } public DbSet<SubjectName> SubjectNames { get; set; } }

3. コントローラー AdminController.cs

Csharp
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

Html
@{ 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

Csharp
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 の接続文字列例

Json
{ "ConnectionStrings": { "DefaultConnection": "Data Source=app.db" } }

動作の流れ

  1. wwwroot/images に PNG ファイルを置く
  2. 管理画面 /Admin/Index にアクセス
  3. 「wwwroot/images の PNG を登録」ボタンを押す
  4. 新規 PNG ファイルが SubjectName テーブルに登録される(既存はスキップ)

このコードは 既存の画像を重複登録しない ようにしており、
管理画面からワンクリックで登録できます。

Powered by Froala Editor

添付画像

画像はありません
Genreのカテゴリ-名
Contexts
編集 | 記事一覧