代码之家  ›  专栏  ›  技术社区  ›  Junior

如何使用ASP.NET核心项目创建到Visual Studio 2017中图像的符号链接?

  •  2
  • Junior  · 技术社区  · 6 年前

    我有一个项目是用 C# 在ASP.NET核心2.2框架的顶部。

    我将资产图像放在项目外部的一个文件夹中,这样我就可以访问外部世界。我的图像物理位置在 c:/public_assets/photos . 当我的应用程序运行URI时 https://mydomain/public/any_image.jpg 需要显示在 c:/public_assets/photos/any_image.jpg .

    然后我会像这样用剃刀视图来渲染我的照片

    <img src="~/public/any_image.jpg" alt="..." />
    

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

    3 回复  |  直到 6 年前
        1
  •  3
  •   Majd Alhayek    6 年前

    您需要将静态文件添加到应用程序生成器中。断面 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="..." />
    
        2
  •  0
  •   Mohamed Elrashid    6 年前

    添加新控制器

    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
    
        3
  •  0
  •   zhimin    6 年前

    使用 FileServer 扩展方法,将流代码添加到 Configuration 你的方法 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);
        }
    
    }
    

    然后您可以在Razor页面中使用这样的图像URL:

    <img src="~/public/any_image.jpg" alt="..." />
    

    您还可以将两个路径字符串放入 appSettings.json ,并从配置中读取它们。