如何从虚拟目录中获取文件并在Asp.net core视图中显示

问题描述

过去我曾经从 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
        });

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

解决方法

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

所以代码可以改成这样:

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

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

,

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

access network drive

访问文件后,您可以使用 FileResult 或 FileStreamResult 或 PhysicalFileResult 渲染文件

render files in asp.net core

,

谢谢大家的回复,我想把我的文件放在 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>

我不确定我是否做得对,但到目前为止工作正常。如果您有任何建议,那就太好了。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...