Jou*_*ner 13 javascript rust webassembly
如何File
在WebAssembly内存上下文中传递要读取的内容?
使用JavaScript在浏览器中读取文件很简单:
<input class="file-selector" type="file" id="files" name="files[]" />
Run Code Online (Sandbox Code Playgroud)
我能够使用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
}));
Run Code Online (Sandbox Code Playgroud)
在JavaScript中,我会从元素中获取文件并将其传递给阅读器,但是,stdweb的API需要以下签名:
pub fn read_as_array_buffer<T: IBlob>(&self, blob: &T) -> Result<(), TODO>
Run Code Online (Sandbox Code Playgroud)
我不知道如何实现IBlob
,我确信我遗漏了一些明显的东西,无论是使用stdweb API还是我对WebAssembly/Rust的理解.我希望有一些东西比将东西转换为UTF-8更简洁.
它在FileReader
自身从 JavaScript 传递到 WebAssembly时起作用。这似乎也是一种干净的方法,因为无论如何都必须由 JavaScript API 读取数据 - 无需从 WASM 调用 JS。
索引.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>
Run Code Online (Sandbox Code Playgroud)
主文件
#![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();
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1476 次 |
最近记录: |