从 ASP.Net Core 中的 wwwroot/images 获取图像

Posted

技术标签:

【中文标题】从 ASP.Net Core 中的 wwwroot/images 获取图像【英文标题】:Get image from wwwroot/images in ASP.Net Core 【发布时间】:2017-07-24 01:38:11 【问题描述】:

我在 wwwroot/img 文件夹中有一个图像,并想在我的服务器端代码中使用它。

如何在代码中获取此图像的路径?

代码是这样的:

Graphics graphics = Graphics.FromImage(path)

【问题讨论】:

【参考方案1】:

仅供参考。只是对此的更新。在 ASP.NET Core 3 和 Net 5 中如下:

    private readonly IWebHostEnvironment _env;

    public HomeController(IWebHostEnvironment env)
    
        _env = env;

    

    public IActionResult About()
    
      var path = _env.WebRootPath;
    

【讨论】:

【参考方案2】:

这行得通:

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

【讨论】:

你应该使用 (var stream = env.WebRootFileProvider.GetFileInfo("image/foo.png").CreateReadStream()) IHostingEnvironment 已过时【参考方案3】:

以 Daniel 的回答为基础,但专门针对 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)。

【讨论】:

【参考方案4】:

注入IHostingEnvironment 然后使用它的WebRootPathWebRootFileProvider 属性会更干净。

例如在控制器中:

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

【讨论】:

使用新版本的 .NET IHostingEnvironment 已弃用并由 IWebHostEnvironment 代替,但此处的代码看起来相同并且工作相同:)【参考方案5】:
 string path =  $"Directory.GetCurrentDirectory()@"\wwwroot\images"";

【讨论】:

如果您从不同的文件夹提供静态文件,这将不起作用。更糟糕的是,Directory.GetCurrentDirectory 在部署到 IIS 等服务器时可能会not return what you expect。 这在 Azure 上也会失败。

以上是关于从 ASP.Net Core 中的 wwwroot/images 获取图像的主要内容,如果未能解决你的问题,请参考以下文章

Asp.Net Core 中的静态文件

Asp.Net Core 中的静态文件

ASP.NET Core 中 wwwroot 的文件夹类型并在 MVC 5 中使用

有没有办法为 ASP.NET Core 中的内容设置通用根路径?

IIS 部署不能包含 asp.net core 2.2 razor 页面中 wwwroot 文件夹的文件

将文件上传到 ASP.NET Core 中不同服务器上 wwwroot 之外的文件夹