以下に 完全・実行可能なサンプルコード を示します。
ポイントは以下です。
wwwroot/images のファイル一覧を取得 (Directory.GetFiles)- 相対パス(例:
"images/xxx.png")を ImageUrl` に保存 - EF Core を使って一括登録
- 重複登録防止(既に登録済みの
ImageUrl はスキップ)
モデルクラス
using System.ComponentModel.DataAnnotations;
public class SubjectName
{
[Key]
public int CategoryId { get; set; }
[Required]
[MaxLength(100)]
public string CategoryName { get; set; }
[Required]
[MaxLength(255)]
public string ImageUrl { get; set; }
}
ApplicationDbContext.cs
using Microsoft.EntityFrameworkCore;
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options) { }
public DbSet<SubjectName> SubjectNames { get; set; }
// DB登録用メソッド
public void SeedImagesFromWwwroot()
{
try
{
// wwwroot/images の絶対パスを取得
var imagesPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "images");
if (!Directory.Exists(imagesPath))
{
Console.WriteLine($"[ERROR] 画像フォルダが存在しません: {imagesPath}");
return;
}
// PNGファイル一覧を取得
var pngFiles = Directory.GetFiles(imagesPath, "*.png", SearchOption.TopDirectoryOnly);
foreach (var filePath in pngFiles)
{
var fileName = Path.GetFileName(filePath);
// DBに保存する相対パス(例: "images/sample.png")
var relativePath = Path.Combine("images", fileName).Replace("\\", "/");
// 重複チェック
if (!SubjectNames.Any(s => s.ImageUrl == relativePath))
{
var subject = new SubjectName
{
CategoryName = Path.GetFileNameWithoutExtension(fileName), // ファイル名をカテゴリ名に
ImageUrl = relativePath
};
SubjectNames.Add(subject);
}
}
SaveChanges();
Console.WriteLine("[INFO] 画像登録が完了しました。");
}
catch (Exception ex)
{
Console.WriteLine($"[ERROR] 登録処理中にエラー: {ex.Message}");
}
}
}
実行例(Program.cs または Startup.cs)
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
// DbContext登録
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
var app = builder.Build();
// アプリ起動時に画像登録
using (var scope = app.Services.CreateScope())
{
var db = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
db.Database.Migrate(); // マイグレーション適用
db.SeedImagesFromWwwroot(); // 画像登録
}
app.Run();
補足
CategoryName はここでは PNG ファイル名(拡張子なし)を使っていますが、必要に応じて別の命名ロジックに変更可能です。ImageUrlは相対パスで保存しているので、ビューで表示する際は<img src="~/@Model.ImageUrl" alt="@Model.CategoryName" />
のように使えます。または
@foreach (var item in Model) {
<tr>
<td>
<img src="~/@item.ImageUrl" alt="@item.Name" style="width: 40px; height: auto;" />
</td>
Powered by Froala Editor