You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Avalonia 12 WebAssembly版StorageProvider选择本地文件时崩溃

解决Avalonia 12 WASM版本地文件访问的net_uri_notabsolute错误

问题根源

浏览器沙箱机制限制了WebAssembly程序直接访问本地文件的真实路径,Avalonia的StorageProvider在WASM环境下返回的IStorageFile.Path是浏览器内部的虚拟URI,并非本地磁盘的绝对路径,因此调用AbsolutePath会抛出net_uri_notabsolute错误。

解决方案

不要直接通过文件路径读写,改用IStorageFile提供的流操作方法来处理文件内容,这是WASM环境下访问本地文件的标准方式。

修改后的代码示例

调整OpenModel方法,改用流读取文件

private async Task OpenModel(CancellationToken token)
{
    try
    {
        var filesService = App.Current?.Services?.GetService<IFilesService>();

        if (filesService is null)
            throw new NullReferenceException("Missing File Service instance.");

        var file = await filesService.OpenModelAsync();

        if (file is null)
            return;

        // 改用流读取文件内容,而非直接获取路径
        using var stream = await file.OpenReadAsync(token);
        // 示例:读取XML内容
        var xmlDoc = await XDocument.LoadAsync(stream, LoadOptions.None, token);
        // 后续处理xmlDoc...
    }
    catch (Exception ex)
    {
        // 异常处理逻辑
    }
}

OpenModelAsync方法无需修改,保持原逻辑即可

public async Task<IStorageFile?> OpenModelAsync()
{
    var toplevel = TopLevel.GetTopLevel(_targetU);
    var files = await toplevel.StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions()
    {
        Title = "Open Model File",
        FileTypeFilter = [FilePickerFileTypes.Xml],
        AllowMultiple = false
    });

    return files.Count >= 1 ? files[0] : null;
}

关键说明

  • WASM运行在浏览器沙箱中,无法直接访问本地文件系统的真实路径,所有文件操作必须通过浏览器提供的File API(Avalonia已封装为IStorageFile的流方法)完成。
  • 桌面端可以正常使用AbsolutePath是因为桌面环境没有沙箱限制,能直接访问本地文件系统。

内容的提问来源于stack exchange,提问作者Peter Jaksch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.07 02:02:32