javascript - 如何使用 JavaScript 将文件读取到 WebAssembly?

标签 javascript rust webassembly

如何传递 File 以在 WebAssembly 内存上下文中读取?

使用 JavaScript 在浏览器中读取文件很容易:

<input class="file-selector" type="file" id="files" name="files[]" />

我能够使用 crate stdweb 引导用 Rust 编写的 WebAssembly 代码,向 DOM 元素添加一个事件监听器并启动一个 FileReader :

let reader = FileReader::new();
let file_input_element: InputElement = document().query_selector(".file-selector").unwrap().unwrap().try_into().unwrap();
file_input_element.add_event_listener(enclose!( (reader, file_input_element) move |event: InputEvent| {
    // mystery part
}));

在 JavaScript 中,我会从元素中获取文件并将其传递给读取器,但是,stdweb 的 API 需要以下签名:

pub fn read_as_array_buffer<T: IBlob>(&self, blob: &T) -> Result<(), TODO>

我不知道如何实现 IBlob 并且我确信我在 stdweb API 或我对 WebAssembly/Rust 的理解中遗漏了一些明显的东西。我希望有比 converting stuff to UTF-8 更简洁的内容.

最佳答案

它在 FileReader 本身从 JavaScript 传递到 WebAssembly 时起作用。这似乎也是一种干净的方法,因为无论如何数据都必须由 JavaScript API 读取——不需要从 WASM 调用 JS。

index.html

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Read to wasm</title>
</head>
<body>
<input type="file" id="file-input"/>
<script src="reader.js"></script>
<script>
    var fileReader = new FileReader();
    fileReader.onloadend = e => Rust.reader
            .then(reader=> {
                window.alert(reader.print_result(fileReader));
            });

    var fileInputElement = document.getElementById("file-input");
    fileInputElement.addEventListener("change", e => fileReader.readAsText(fileInputElement.files[0]));
</script>
</body>
</html>

ma​​in.rs

#![feature(proc_macro)]

#[macro_use]
extern crate stdweb;

use stdweb::js_export;
use stdweb::web::FileReader;
use stdweb::web::FileReaderResult;

#[js_export]
fn print_result(file_reader: FileReader) -> String {
    match file_reader.result() {
        Some(value) => match value {
            FileReaderResult::String(value) => value,
            _ => String::from("not a text"),
        }
        None => String::from("empty")
    }
}

fn main() {
    stdweb::initialize();

    stdweb::event_loop();
}

关于javascript - 如何使用 JavaScript 将文件读取到 WebAssembly?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51047146/

相关文章:

rust - 折叠字符串以在rust中构建hashmap char计数器,但给出两阶段借用错误

c# - Blazor 组件之间注入(inject)的单例服务是不同的 [.NET 6]

javascript - 我如何检测 Emscripten 生成的 .js 何时完成加载 wasm,以便我可以运行调用它的 JS 函数?

javascript - CSS3 重置动画需要超时(如果从外部样式表设置动画)

javascript - 在 URL 中显示两个单独的选择框值

javascript - 在 jquery 中更改列表切换

rust - 有没有办法用 Serde 定义标签字段?

rust - 在 map 函数闭包中使用问号运算符的替代方法

javascript - 将变量传递给后台脚本并在跨选项卡的其他函数中使用它,而不使用存储 api

javascript - 如何将(数字)数组加载到谷歌应用程序脚本中 Byte[]