我在ASP.NET Core 2.2框架的顶部有一个使用C#
编写的项目。
我的资产图像位于项目外部的文件夹中,需要外界访问。我的图像实际位于c:/public_assets/photos
。当我的应用程序运行时,URI https://mydomain/public/any_image.jpg
将需要显示在c:/public_assets/photos/any_image.jpg
处找到的图像。
然后我将像这样用razor-view渲染图片
<img src="~/public/any_image.jpg" alt="..." />
我希望这是一个可以添加到项目配置文件中的设置,因此当我将项目部署到生产环境时,只需更改配置即可。
答案 0 :(得分:3)
您需要将静态文件添加到您的应用构建器。 Serve files outside of web root部分对如何执行操作进行了很好的说明。
根据您的情况,导航到您的Startup
类。在public void Configure(IApplicationBuilder app ....)
中添加以下代码
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(@"c:/public_assets/photos"),
RequestPath = "/photos"
});
现在您应该可以使用类似的视图渲染照片
<img src="~/public/any_image.jpg" alt="..." />
答案 1 :(得分:0)
添加新的控制器
public class publicController : Controller
{
public FileResult pic(string id)
{
var fileName = id;
if (fileName.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0) throw new Exception();
string absolutePath = Path.GetFullPath(Path.Combine("c:/public_assets/photos/", fileName));
if (!System.IO.File.Exists(absolutePath)) throw new Exception();
byte[] fileBytes = System.IO.File.ReadAllBytes(absolutePath);
string fileExtension = Path.GetExtension(absolutePath).Replace(".", "");
fileName = Path.GetFileName(absolutePath);
return File(fileBytes, "image/" + fileExtension, fileName);
}
}
编辑
检查所有扩展名
public class publicController : Controller
{
public ActionResult pic(string id)
{
var fileName = id;
if (fileName.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0) return NotFound();
string absolutePath = Path.GetFullPath(Path.Combine("c:/public_assets/photos/", fileName));
if (!System.IO.File.Exists(absolutePath)) return NotFound();
string fileExtension = Path.GetExtension(absolutePath).Replace(".", "").ToLower();
if (fileExtension != "jpg") return NotFound();
var fileBytes = System.IO.File.OpenRead(absolutePath);
fileName = Path.GetFileName(absolutePath);
return File(fileBytes, "image/" + fileExtension, fileName);
}
}
然后打电话
http://xxxxxxxxx/public/pic/1.jpg
http://xxxxxxxxx/public/pic/MikeA.jpg
答案 2 :(得分:0)
使用FileServer
扩展方法,将正在执行的代码添加到Configuration
的{{1}}方法中:
Startup.cs
然后,您可以在剃须刀页面中使用如下图像网址:
public class Startup {
public void Configure(IApplicationBuilder app) {
// other configure code
var opts = new FileServerOptions {
RequestPath = "/public",
FileProvider = new PhysicalFileProvider(@"c:/public_assets/photos")
};
app.UseFileServer(opts);
}
}
您还可以将两个路径字符串放入<img src="~/public/any_image.jpg" alt="..." />
中,并从配置中读取它们。