我试图通过输入字段上传的文件内容访问迭代器。
我可以通过web-sys将JS文件传递到Wasm中,但是我无法在Rust中找到除了长度和名称之外的其他内容。
我想我可以把整个文件作为一个ByteArray传递到Wasm中,并在上面进行复制,但最好是直接在文件内容上进行复制,而不进行复制,因为文件本身会很大(~1 GB)。
我在Mozilla JS文档中发现,我应该能够访问底层文件blob,通过.stream()
方法从中获取ReadableStream,并从应该能够迭代的地方获取Reader。但是在web-sys中,ReadableStream的.getReader()
方法返回一个简单的JSValue,我不能用它做任何有用的事情。
我在这里错过了什么,或者这个功能只是在web-sys中缺少,或者有其他方法可以做到这一点?也许在JS中创建Iterator并将其传递给Rust?
5条答案
按热度按时间3pvhb19x1#
我设法得到了一个使用read_as_binary_string的工作示例。
这里的代码
lib.rs
index.html
Cargo.toml
你可以在这里查看示例:http://rustwasmfileinput.glitch.me/
mi7gmzs62#
你最好的选择是使用
wasm_streams
crate,它将从.stream()
方法获得的ReadableStream
等Web流API连接到Rust流API。官方示例使用Fetch API作为源代码,但这部分也与您的File用例相关:https://github.com/MattiasBuelens/wasm-streams/blob/f6dacf58a8826dc67923ab4a3bae87635690ca64/examples/fetch_as_stream.rs#L25-L33
hpcdzsge3#
我想你可以用
FileReader
做类似的事情。下面是一个例子,我记录了一个文件的文本内容:
HTML:
Cargo.toml
但是我不知道如何使用
ReadableStream
的get_reader()
,因为根据链接的documentation,它应该返回ReadableStreamDefaultReader
或ReadableStreamBYOBReader
。虽然后者是实验性的,我认为这是可以理解的,它不存在于web-sys
中,我不知道为什么ReadableStreamDefaultReader
也不存在。k4ymrczo4#
你应该使用ReadableStreamDefaultReader::new()。
然后你可以像使用in JS一样使用
ReadableStreamDefaultReader.read()
。你还需要struct来实现结构化:
以下是使用示例:
pw136qt25#
我将在这里分享我昨天遇到的repository,它正好说明了这一点。
实际上,它读取文件的第一个字节。考虑到结果是即时的,它显然没有将整个文件加载到内存中,而是从文件句柄中阅读。
此外,您还可以使用FileSystemSyncAccessHandle,它提供了一个细粒度的
read()
方法,包括偏移量。