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
相关产品推荐
相关产品推荐

