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

Unity WebGL中System.IO.File.ReadAllBytes无法读取Blob URL问题

Blob URL无法通过System.IO.File.ReadAllBytes读取的问题解决

我使用以下代码读取文件字节数据:

byte[] dataToPost = System.IO.File.ReadAllBytes(filePath);

当filePath为Application.persistentDataPath下的本地图片路径时,代码运行正常。但传入类似"blob:http://localhost:8000/3dcf66b0-5052-4b2d-bc00-070255483b48"的Blob URL时,会抛出错误:

DirectoryNotFoundException: Could not find a part of the path "/blob:http:/localhost:8000/3dcf66b0-5052-4b2d-bc00-070255483b48".
  at System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, System.Int32 bufferSize, System.Boolean anonymous, System.IO.FileOptions options) [0x00000] in <00000000000000000000000000000000>:0

错误日志显示Blob URL被错误解析为本地文件路径:/blob:http:/localhost:8000/3dcf66b0-5052-4b2d-bc00-070255483b48

问题原因

System.IO.File.ReadAllBytes是针对本地文件系统路径设计的API,它无法识别Blob URL——这种URL是浏览器环境中指向内存中二进制数据对象的引用,并非实际存在于本地磁盘的文件路径,所以直接传入会被当成本地路径解析,自然找不到对应文件。

解决方案

针对Unity WebGL环境(Blob URL通常出现在WebGL场景中),可以通过JS交互来读取Blob内容:

步骤1:编写JS交互代码

在项目中创建.jslib文件(比如BlobReader.jslib),添加以下代码:

mergeInto(LibraryManager.library, {
    ReadBlobData: function(blobUrlPtr, callbackNamePtr) {
        const blobUrl = Pointer_stringify(blobUrlPtr);
        fetch(blobUrl)
            .then(response => response.arrayBuffer())
            .then(buffer => {
                const uint8Array = new Uint8Array(buffer);
                // 调用C#回调传递数据
                const callbackName = Pointer_stringify(callbackNamePtr);
                SendMessage('BlobReader', 'OnBlobDataReceived', Array.from(uint8Array));
            })
            .catch(error => console.error('读取Blob失败:', error));
    }
});

步骤2:C#端调用代码

创建C#脚本挂载到场景中的GameObject(命名为BlobReader):

using UnityEngine;
using System.Runtime.InteropServices;

public class BlobReader : MonoBehaviour
{
    private byte[] _blobBytes;

    [DllImport("__Internal")]
    private static extern void ReadBlobData(string blobUrl, string callbackName);

    public void LoadBlobFromUrl(string blobUrl)
    {
#if UNITY_WEBGL && !UNITY_EDITOR
        ReadBlobData(blobUrl, "OnBlobDataReceived");
#else
        Debug.LogError("Blob读取仅支持WebGL平台");
#endif
    }

    public void OnBlobDataReceived(byte[] data)
    {
        _blobBytes = data;
        // 这里处理读取到的字节数据,比如赋值给dataToPost
        byte[] dataToPost = _blobBytes;
        Debug.Log($"成功读取Blob数据,长度:{dataToPost.Length}");
    }
}

替代方案

如果Blob是由你的代码生成的,建议在创建Blob时直接保留原始字节数组,避免后续通过URL读取——这样可以跳过JS交互步骤,直接在C#中使用数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 21:17:11