#file-reader #wasm-bindgen #web #read #file-read #seek #u64

wasm-bindgen-file-reader

为 web_sys::File 实现了 Read+Seek

1 个稳定版本

1.0.0 2022年7月1日

1034WebAssembly

Download history 16/week @ 2024-03-11 1/week @ 2024-03-18 1/week @ 2024-03-25 39/week @ 2024-04-01 6/week @ 2024-04-15 14/week @ 2024-04-22 6/week @ 2024-05-13 10/week @ 2024-05-20 23/week @ 2024-05-27 20/week @ 2024-06-03 24/week @ 2024-06-10 4/week @ 2024-06-17 40/week @ 2024-06-24

89 每月下载次数

GPL-3.0 许可证

16KB
100 代码行

wasm-bindgen-file-reader

这个包实现了一个围绕 web_sys::File 的包装器,该包装器实现了 ReadSeek。当你有一个期望泛型读取器的 Rust 包,并且想在 WebAssembly 中使用它,而无需将整个文件加载到内存中并使用 std::io::Cursor 时,这很有用。

注意:这只能在 Web Worker 上下文中工作,因为它使用了同步的 FileReaderSync 接口

安装

添加到 Cargo.toml

wasm-bindgen-file-reader = "1"

用法

有关更多信息,请参阅 演示

Rust 代码

use wasm_bindgen_file_reader::WebSysFile;
use std::io::Read;
use std::io::Seek;
use std::io::SeekFrom;

/// Read one byte from the file at a given offset.
#[wasm_bindgen]
pub fn read_at_offset_sync(file: web_sys::File, offset: u64) -> u8 {
    let mut wf = WebSysFile::new(file);

    // Now we can seek as if this was a real file
    wf.seek(SeekFrom::Start(offset))
        .expect("failed to seek to offset");

    // Use 1-byte buffer because we only want to read one byte
    let mut buf = [0];

    // The Read API works as with real files
    wf.read_exact(&mut buf).expect("failed to read bytes");

    buf[0]
}

JavaScript 代码(index.html)

let myWorker = new Worker("worker.js");
document.getElementById("filepicker").addEventListener(
    "change",
    function() {
        let file = this.files[0];
        myWorker.postMessage({ file: file, offset: 0 });
        myWorker.onmessage = function(e) {
            console.log("First byte of file is: ", e.data);
        };
    },
    false
);

JavaScript 代码(worker.js)

onmessage = async function(e) {
    let wasm_bindgen_file_reader_test = await Rust.wasm_bindgen_file_reader_test;
    let workerResult = wasm_bindgen_file_reader_test.read_at_offset_sync(
        e.data.file,
        e.data.offset,
    );
    postMessage(workerResult);
};

依赖项

~6.5–8.5MB
~171K SLoC