web-dev-qa-db-ja.com

ASP.Net Coreのwwwroot / imagesから画像を取得する

Wwwroot/imgフォルダーに画像があり、サーバー側のコードで使用したい。

コードでこの画像へのパスを取得するにはどうすればよいですか?

コードは次のとおりです。

Graphics graphics = Graphics.FromImage(path)
8
Techy

IHostingEnvironmentを挿入し、そのWebRootPathまたはWebRootFileProviderプロパティを使用する方がクリーンです。

たとえば、コントローラーで:

_private readonly IHostingEnvironment env;
public HomeController(IHostingEnvironment env)
{
    this.env = env;
}

public IActionResult About(Guid foo)
{
    var path = env.WebRootFileProvider.GetFileInfo("images/foo.png")?.PhysicalPath
}
_

ビューでは通常、Url.Content("images/foo.png")を使用して、その特定のファイルのURLを取得します。ただし、何らかの理由で物理パスにアクセスする必要がある場合は、同じアプローチに従うことができます。

_@inject Microsoft.AspNetCore.Hosting.IHostingEnvironment env
@{ 
 var path = env.WebRootFileProvider.GetFileInfo("images/foo.png")?.PhysicalPath
}
_
14
Daniel J.G.

ダニエルの答えに基づいて構築されていますが、特にASP.Net Core 2.2の場合:

コントローラーで依存性注入を使用します。

[Route("api/[controller]")]
public class GalleryController : Controller
{
    private readonly IHostingEnvironment _hostingEnvironment;
    public GalleryController(IHostingEnvironment hostingEnvironment)
    {
        _hostingEnvironment = hostingEnvironment;
    }        

    // GET api/<controller>/5
    [HttpGet("{id}")]
    public IActionResult Get(int id)
    {
        var path = Path.Combine(_hostingEnvironment.WebRootPath, "images", $"{id}.jpg");
        var imageFileStream = System.IO.File.OpenRead(path);
        return File(imageFileStream, "image/jpeg");
    }
}

IHostingEnvironmentの具体的なインスタンスがコントローラーに挿入され、それを使用してWebRootPath(wwwroot)にアクセスできます。

3
Scott Ferguson

これは機能します:

private readonly IHostingEnvironment env;
public HomeController(IHostingEnvironment env)
{
    this.env = env;
}

public IActionResult About()
{
    var stream = env.WebRootFileProvider.GetFileInfo("image/foo.png").CreateReadStream();
    System.Drawing.Image image = System.Drawing.Image.FromStream(stream);
    Graphics graphics = Graphics.FromImage(image);
}
1
A. Morel