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

Rust+Wasm:如何为read_with_array_buffer_view传入合法的ArrayBufferView参数?

问题解决方法

错误原因

你错误地将Uint8Array包装成了带obj属性的普通Object,但ReadableStreamByobReader::read_with_array_buffer_view方法直接接受的是ArrayBufferView类型实例,Uint8Array本身就属于这个类型范畴,不需要额外包装。

修正后的核心代码

直接传入Uint8Array实例即可:

let dref = jval.dyn_ref::<ReadableStreamByobReader>();
let byob_reader = dref.unwrap();

let array = Uint8Array::new_with_length(fsize as u32);
// 无需包装Object,直接传递Uint8Array
let promise = byob_reader.read_with_array_buffer_view(&array);

完整流程(转UTF8字符串)

读取完成后需要处理Promise结果并转换为目标字符串:

use wasm_bindgen::JsCast;
use wasm_bindgen_futures::JsFuture;
use web_sys::ReadableStreamReadResult;

// 异步处理读取Promise
let result = JsFuture::from(promise).await?;
let read_result: ReadableStreamReadResult = result.dyn_into()?;

if !read_result.done() {
    // 将读取到的二进制数据转为UTF8字符串
    let data = read_result.value().dyn_into::<Uint8Array>()?;
    let text = String::from_utf8(data.to_vec())?;
    // 后续使用text即可
}

可行性说明

该方法完全可行,web_sys已正确绑定浏览器的ReadableStreamBYOBReader接口,只要参数类型匹配就能正常工作。

替代方案(更适合小文件)

由于你的文件小于4K,无需流式读取,用FileReader实现会更简洁:

use web_sys::{FileReader, Blob};
use wasm_bindgen_futures::JsFuture;

// 假设已有Blob/File实例
let blob: Blob = ...;
let reader = FileReader::new()?;
let promise = reader.read_as_text(&blob);
let text = JsFuture::from(promise).await?.as_string().unwrap();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 03:27:14