使用 Blazor 读取服务器端文件

jsm*_*ars 3 c# web .net-core webassembly blazor

我有一个基于 Blazor 示例的项目.Client,其中包含,.Server.Shared项目。我data.txt在服务器上有一个文本文件,我希望能够使用标准StreamReader/System.IO.File方法读/写。由于 Blazor 在沙箱中运行,我想我无法像在普通 Windows 应用程序中那样访问整个文件系统?我已将文件放在wwwroot目录中,如果url/data.txt在浏览器中输入,我什至可以从客户端访问该文件,以便提供文件,我不想这样,但尝试读取该文件:

var file = File.ReadAllText("data.txt");
Run Code Online (Sandbox Code Playgroud)

结果报错:

WASM: [System.IO.FileNotFoundException] Could not find file "/data.txt"
Run Code Online (Sandbox Code Playgroud)

如何读取服务器端文件并使它们对客户端隐藏?

jsm*_*ars 6

事实证明这比我想象的要容易。我从错误的角度接近它。要访问服务器端文件,请创建一个控制器:

using Microsoft.AspNetCore.Mvc;

namespace Favlist.Server.Controllers
{
    [Route("api/[controller]")]
    public class DataFetcher : Controller
    {
        [HttpGet("[action]")]
        public MyDataClass GetData(string action, string id)
        {
            var str = File.ReadAllText("data.txt");
            return new MyDataClass(str);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并在您的页面中调用它,如下所示:

@using System.IO;
@page "/dataview"
@inject HttpClient Http

@if (data == null)
{
    <p><em>Loading...</em></p>
}
else
{
    <p>@data.Name</p>
}

@functions {
    MyDataClass data;

    protected override async Task OnInitAsync()
    {
        data = await Http.GetJsonAsync<MyDataClass>("api/DataFetcher/GetData");
    }
}
Run Code Online (Sandbox Code Playgroud)

MyDataClass 是包含您需要读/写的任何内容的自定义类。

然后,您可以像往常一样在服务器上的任何位置访问文件。当前目录是您的 Project.Server 根文件夹。

  • 只是一个拼写错误 - File.ReadAllTest 应该是文本,而不是为了混淆其他人(经过大量的试验和错误,当我复制代码时,红线令人沮丧:D)。此外,该文件是 System.IO.File,而不是 ControllerBase.File。我花了一段时间才发现这一点;) (2认同)

Tos*_*Net 5

要读取项目中放置的服务器端文件,请使用以下命令:

System.IO.File.ReadAllText($"{System.IO.Directory.GetCurrentDirectory()}{@"\wwwroot\data.txt"}");

文章: https: //www.peug.ne​​t/en/reading-server-side-files -using-blazor/