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

