如何使用ASP.NET Core项目在Visual Studio 2017中创建指向图像的符号链接?

时间:2019-01-05 21:40:55

标签: c# asp.net-mvc asp.net-core asp.net-core-mvc asp.net-core-2.1

我在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="..." />

我希望这是一个可以添加到项目配置文件中的设置,因此当我将项目部署到生产环境时,只需更改配置即可。

3 个答案:

答案 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="..." /> 中,并从配置中读取它们。