Jos*_*ero 9 c# .net-core asp.net-core
我正在尝试创建一个公开一些数据的休息服务,一切都很好,直到我意识到从服务器公开图像完整URL很痛苦.也许这只是我,但我发现它非常复杂.
只是为了在上下文中,我使用Entity Framework从我的数据库中读取,这是我正在使用的表:
正如你所看到的,有一个名为"ImagePath"的字段,坏名字,它应该是"ImageName",无论如何,该列保存了代表该Champion对象的图像的确切文件名,所有图像当前都位于在wwwroot项目文件夹中,就像这样:
所有业务逻辑都不在控制器中,位于常规类的服务文件夹/层中(也许这不相关,但我只是想澄清一点,我不在任何控制器内工作):
这是我期待魔术发生的方法:
public async Task<IList<Champion>> GetChampions()
{
   List<Champion> champions = await _context.Champion
   .Include(x => x.PrimaryClass)
   .Include(x => x.SecondaryClass)
   .Include(x => x.ChampionUserRate)
   .ToListAsync();
   //BEFORE RETURNING THE CHAMPION TO THE CONTROLLER, I WILL NEED TO CONCATENATE MY CURRENT SERVER URL AND THE PATH TO THE IMAGE PLUS THE IMAGE NAME FILE WHICH IS ALREADY IN THE DATABASE AND ALREADY MATCHES THE IMAGES FOLDER
   string serverPathToChampionsFolder = null; //Example: http://localhost:57435/wwwroot/Champions
   foreach (var champion in champions)
   {
       champion.ImagePath = serverPathToChampionsFolder + champion.ImagePath;
   }
return champions;
}
在这里要清楚,这里的关键是:
 string serverPathToChampionsFolder = null; //Example: http://localhost:57435/wwwroot/Champions
我需要以某种方式获取当前URL,就像在示例中将它添加到每个冠军一样,以便客户端可以在图像标记内使用它.
如果我不能通过我试图实现的方法来实现它,我将接受任何其他建议,这里的重点是公开图像URL,无论如何.
基本上,您需要IHostingEnvironment在服务构造函数中使用并注入它.然后创建一个字符串变量,其中包含wwwroot中文件夹的名称"Champions"
这是示例代码:
private readonly IHostingEnvironment hostingEnv;
private const string ChampionsImageFolder = "Champions";
public ChampionsService(IHostingEnvironment hostingEnv){
    this.hostingEnv = hostingEnv;
}
// Suppose this method is responsible for fetching image path
public string GetImage(){
    var path = Path.Combine(hostingEnv.WebRootPath, ChampionsImageFolder);
    return path;
}
什么IHostingEnvironment接口并为"提供有关的应用程序运行在托管环境的信息."
如果要在给定路径中获取文件,这将为您提供一个提示.
var directoryFiles = Directory.GetFiles("wwwroot/Champions");
foreach (var item in directoryFiles)
{
    // do something here
}
如果你想从那些wwwroot文件夹创建路径链接,你需要在你的启动时注册 UseDirectoryBrowser
在Startup.cs文件中,查找Configure方法插入此代码段
这些代码片段将公开Champions目录中的文件,并在您的网站上创建一个新路由,该路由ChampionImages源自Champions您的文件夹wwwroot
app.UseDirectoryBrowser(new DirectoryBrowserOptions()
{
    FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot", "Champions")),
    RequestPath = new PathString("/ChampionImages")
});
然后你现在可以使用这样的东西localhost:8080/ChampionImages,你可以看到存储在wwwroot的Champions文件夹中的每个文件.你可以做些什么来创建该图像的URL是这样的.
var imageUrl = $"/ChampionImages/{exactFileName}"; // this will create a string link.
我希望这个简单的代码片段能给你帮助或想法:)
| 归档时间: | 
 | 
| 查看次数: | 7074 次 | 
| 最近记录: |