【问题标题】:How to get files from virtual directory and display in view Asp.net core如何从虚拟目录中获取文件并在视图中显示 Asp.net core
【发布时间】:2021-03-20 02:03:04
【问题描述】:

过去我曾经从 wwwroot 文件夹存储和获取我的文件并将它们显示在视图中,但现在我想将我的所有文件放在不同的文件服务器位置,因为它的大小。下面是旧的实现。

public IActionResult Index ()
        {
            string[] filePaths = Directory.GetFiles(Path.Combine(this.Environment.WebRootPath, "Audio/"));

            List<FileViewModel> files = new List<FileViewModel>();
            foreach (string filePath in filePaths)
            {
                files.Add(new FileViewModel { FileName = Path.GetFileName(filePath) });
            }

            return View(files);
                                
        }

现在我想将所有文件从 wwwroot 移动到另一个网络位置,我需要创建一个虚拟目录并在目录中循环以获取我的文件,但我做不到,我确实阅读了一些在 Asp.net Core 中我们需要在 startup.cs 中有以下代码才能从另一个位置获取文件的文章。

app.UseFileServer(new FileServerOptions
        {
            FileProvider = new PhysicalFileProvider(@"\\xxx"),
            RequestPath = new PathString("/Audio"),
            EnableDirectoryBrowsing = true
        });

我在上面做了,但不确定如何在我的控制器中使用它来执行我过去使用的相同操作并在视图索引中显示文件。任何帮助,将不胜感激。谢谢

【问题讨论】:

  • 嗨@M I,您的虚拟目录在哪里?只需使用与Directory.GetFiles() 中的new PhysicalFileProvider(@"\\xxx") 相同的路径即可。
  • 对于网络应用程序,我认为不可能访问应用程序文件夹之外的任何其他文件夹。除非用户通过 ui 文件对话框浏览文件。除非它是 Windows 服务或桌面应用程序。

标签: c# asp.net-core


【解决方案1】:

IWebHostEnvironment(从 asp.net core 2.2 向后称为 IHostingEnvironment)有 2 个方便的属性来保存根路径。 wwwroot 的一个可以通过IWebHostEnvironment.WebRootPath 访问,另一个内容根目录(wwwroot 的父文件夹)可以通过IWebHostEnvironment.ContentRootPath 访问。因此,当您使用另一个文件夹来保存您的文件时,它应该与wwwroot 处于同一级别,当然也应该以IWebHostEnvironment.ContentRootPath 为根。

所以代码可以改成这样:

 string[] filePaths = Directory.GetFiles(Path.Combine(this.Environment.ContentRootPath, 
                                                      "YourCustomRoot", "Audio/"));

静态文件中间件仅用于自动处理静态文件请求。所以它在这里没有任何作用,因为您在服务中显式编写代码来访问文件。

【讨论】:

    【解决方案2】:

    如果您希望从网络共享中获取文件,请记住从需要提供真实凭据的网络访问文件,最好的凭据将是 Web 应用程序的应用程序池标识,或者如果正在使用 Windows 身份验证,那么您可以使用请求的身份。

    access network drive

    一旦您可以访问文件,您就可以使用 FileResult 或 FileStreamResult 或 PhysicalFileResult 呈现文件

    render files in asp.net core

    【讨论】:

      【解决方案3】:

      谢谢大家的回复,我想把我的文件放在 wwwroot 的原因,然后再放到网络服务器本地的某个地方是因为那些音频文件和浏览器只能播放来自网络服务器的音频文件不是本地或网络存储。

      起初我在html中尝试了如下音频标签,然后chrome阻止了它,

      所以我一直在寻找可以让网络服务器为我的音频文件提供服务的东西,Chrome 不会阻止它,解决方案是虚拟目录。

      最后,我在启动时添加了以下内容并将我的音频标签指向它

      启动

      app.UseFileServer(new FileServerOptions
              {
                  FileProvider = new PhysicalFileProvider(@"\\xxx"),
                  RequestPath = new PathString("/Audio"),
                  EnableDirectoryBrowsing = true
              });
      

      控制器

      string[] filePaths = Directory.GetFiles(Path.Combine(@"\\xxx));
      

      查看

      <audio controls src="https://mywebserver/Audio/name.wav" type="audio/wav"> </audio>
      

      我不确定我是否做得对,但到目前为止工作正常。如果你有任何建议会很棒。

      【讨论】:

        猜你喜欢
        • 2021-10-30
        • 2020-10-20
        • 1970-01-01
        • 1970-01-01
        • 2019-11-01
        • 2016-05-23
        • 2022-11-23
        • 1970-01-01
        • 2012-09-24
        相关资源
        最近更新 更多