Get image from wwwroot/images in ASP.Net Core

2020-06-04 03:34发布

问题:

I have an image in wwwroot/img folder and want to use it in my server side code.

How can I get the path to this image in code?

The code is like this:

Graphics graphics = Graphics.FromImage(path)

回答1:

 string path =  $"{Directory.GetCurrentDirectory()}{@"\wwwroot\images"}";


回答2:

It would be cleaner to inject an IHostingEnvironment and then either use its WebRootPath or WebRootFileProvider properties.

For example in a controller:

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
}

In a view you typically want to use Url.Content("images/foo.png") to get the url for that particular file. However if you need to access the physical path for some reason then you could follow the same approach:

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


回答3:

Building on Daniel's answer, but specifically for ASP.Net Core 2.2:

Use dependency injection in your controller:

[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");
    }
}

A concrete instance of the IHostingEnvironment is injected into your controller, and you can use it to access WebRootPath (wwwroot).



回答4:

This works:

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);
}