はい、ASP.NET Core MVC で wwwroot/Images フォルダー内のファイル名を取得し、
SelectList に変換して View に渡すサンプルコードを作成できます。
以下は 完全に動作するサンプル です。
Controller サンプル
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using System.IO;
using System.Linq;
namespace YourApp.Controllers
{
public class ImageController : Controller
{
private readonly IWebHostEnvironment _env;
public ImageController(IWebHostEnvironment env)
{
_env = env;
}
public IActionResult Index()
{
// wwwroot/Images フォルダーの絶対パスを取得
string imagesPath = Path.Combine(_env.WebRootPath, "Images");
// フォルダーが存在しない場合は空のリストを返す
if (!Directory.Exists(imagesPath))
{
ViewBag.ImageList = new SelectList(Enumerable.Empty<string>());
return View();
}
// 対象拡張子のファイルを取得(jpg, png, gif)
var files = Directory.EnumerateFiles(imagesPath)
.Where(f => new[] { ".jpg", ".jpeg", ".png", ".gif" }
.Contains(Path.GetExtension(f).ToLower()))
.Select(f => Path.GetFileName(f)) // ファイル名のみ
.ToList();
// SelectList を作成(Value と Text を同じにする例)
ViewBag.ImageList = new SelectList(files);
return View();
}
}
}
View (Index.cshtml) サンプル
@{
ViewData["Title"] = "Image Select";
}
<h2>画像選択</h2>
<form method="post">
<select asp-items="ViewBag.ImageList" name="selectedImage"></select>
<button type="submit">送信</button>
</form>
ポイント
IWebHostEnvironment.WebRootPath を使うことで wwwroot の物理パスを取得できます。Directory.EnumerateFiles() でファイル一覧を取得し、拡張子フィルタをかけています。Path.GetFileName() でファイル名だけを抽出し、SelectList に変換しています。- View 側では
asp-items を使って簡単に <select> を生成できます。
もし ファイル名だけでなく画像のURLも Value にしたい 場合は、
以下のように変更できます。
var files = Directory.EnumerateFiles(imagesPath)
.Where(f => new[] { ".jpg", ".jpeg", ".png", ".gif" }
.Contains(Path.GetExtension(f).ToLower()))
.Select(f => new {
FileName = Path.GetFileName(f),
Url = "/Images/" + Path.GetFileName(f)
})
.ToList();
ViewBag.ImageList = new SelectList(files, "Url", "FileName");
このコードを使えば、wwwroot/Images 内のファイル名を動的に取得してドロップダウンに表示できます。
必要なら、このまま選択した画像をプレビュー表示する機能も追加できます。
もしご希望なら、このサンプルに 選択した画像を即時プレビューする JavaScript 付きバージョン を作成できますが、作りますか?
Powered by Froala Editor