我正在将ASP Net Core 2.0.5与MVC一起使用,并希望在wwwroot
之外提供一个静态文件夹。
我的输入文件如下所示。
wwwroot
staticfolder
10
index.html
image1.png
image2.png
sub-folder
image3.jpg
index.html
由其他程序生成。所有图像都在index.html中使用。
我们希望在验证通过后进入服务器,即用户可以通过路径index.html
查看api/flight/10/index.html
。但是我需要检查用户访问资源flight 10
的权限。
我知道Physicalfile
可用于在wwwroot之外提供静态文件(例如* .png),也可将app.UseStaticFiles
配置为在startup.cs中提供文件夹和文件。
一些伪代码为最小示例。
[Route("api/flight/{flight}/index.html")]
[HttpGet]
public IActionResult GetImageThumbnail(
[FromRoute] int flight)
{
// Check permission
List<Flight> data = _context
.Flight(id: flight)
.ToList();
if (data.Count() == 0)
{
return NotFound("No permission.");
}
// data[0].BaseFolder is a folder outside wwwroot
string filename = data[0].BaseFolder + "/index.html";
// Return the content for index.html
...
}
所以我的问题是我应该如何使用上面类似的方法来处理混合了html和图像的文件夹。
答案 0 :(得分:0)
我找到了实现目标的简单解决方案。如果其他人有相同的问题,请在此处发布。
关键是要使用{*file}
设置Route,它会匹配末尾的任何字符串。
[Route("api/flight/{flight}/{*file}")]
[HttpGet]
public async Task<IActionResult> GetImageThumbnail([FromRoute]int flight,
[FromRoute] string file)
{
// Check permission
List<Flight> data = _context
.Flight(id: flight)
.ToList();
if (data.Count() == 0)
{
return NotFound("No permission.");
}
string filename = Path.Combine(data[0].BaseFolder, file);
var provider = new Microsoft.AspNetCore.StaticFiles.FileExtensionContentTypeProvider();
string minetype = "";
provider.TryGetContentType(filename, out minetype);
return PhysicalFile(filename, minetype);
}