如何从 HTML 输入加载文件到 Emscripten 的 MEMFS 文件系统?
How can I load a file from a HTML input into Emscripten's MEMFS file system?
我有一个 HTML 这样的输入 <input type="file" id="myfile" onchange="load_file()">
。
我想将文件加载到 Emscripten 的 MEMFS 文件系统中。
查看 Emscripten file API 我一直在尝试使用 FS.mount() 来这样做。
然而,文档只给出了一个使用 WORKERFS 挂载的示例,所以我尝试这样玩弄它。
let files = document.getElementById('myfile').files;
let file=files[0];
FS.mount(MEMFS, {files: file },'test');
console.log(FS.readFile('test/' + file.name));
但是当我尝试读取文件时收到 "No such file or directory" 错误消息。
对我哪里出错有什么建议吗?
这是我最后做的事情–
input_test.html 文件输入:
<html>
<body>
<input type="file" id="myfile" onchange="load_file()">
</body>
<script type="text/javascript" src="auto_em.js"></script>
<script type="text/javascript" src="input_test.js"></script>
</html>
input_test.js 然后将文件作为 ArrayBuffer 读取,然后使用该缓冲区的 Uint8Array 视图将文件写入 Emscripten 的 MEMFS:
let reader= new FileReader();
function load_file(){
let files = document.getElementById('myfile').files;
let file=files[0];
reader.addEventListener('loadend', print_file);
reader.readAsArrayBuffer(file);
}
function print_file(e){
let result=reader.result;
const uint8_view = new Uint8Array(result);
FS.writeFile('write_test.txt', uint8_view)
Module.ccall('print_file', 'number', ['string'], ['write_test.txt'])
}
print_input.cpp 打印文件以检查其是否有效:
#include <stdio.h>
extern "C" {
int print_file(char* file_path){
FILE *file = fopen(file_path, "r");
if (!file) {
printf("cannot open file\n");
return 1;
}
while (!feof(file)) {
char c = fgetc(file);
if (c != EOF) {
putchar(c);
}
}
return 0;
}
}
然后编译使用:
emcc print_input.cpp -o auto_em.js -s "EXPORTED_FUNCTIONS=['_print_file']" -s "EXTRA_EXPORTED_RUNTIME_METHODS=['ccall']" -s FORCE_FILESYSTEM=1
我有一个 HTML 这样的输入 <input type="file" id="myfile" onchange="load_file()">
。
我想将文件加载到 Emscripten 的 MEMFS 文件系统中。
查看 Emscripten file API 我一直在尝试使用 FS.mount() 来这样做。
然而,文档只给出了一个使用 WORKERFS 挂载的示例,所以我尝试这样玩弄它。
let files = document.getElementById('myfile').files;
let file=files[0];
FS.mount(MEMFS, {files: file },'test');
console.log(FS.readFile('test/' + file.name));
但是当我尝试读取文件时收到 "No such file or directory" 错误消息。
对我哪里出错有什么建议吗?
这是我最后做的事情–
input_test.html 文件输入:
<html>
<body>
<input type="file" id="myfile" onchange="load_file()">
</body>
<script type="text/javascript" src="auto_em.js"></script>
<script type="text/javascript" src="input_test.js"></script>
</html>
input_test.js 然后将文件作为 ArrayBuffer 读取,然后使用该缓冲区的 Uint8Array 视图将文件写入 Emscripten 的 MEMFS:
let reader= new FileReader();
function load_file(){
let files = document.getElementById('myfile').files;
let file=files[0];
reader.addEventListener('loadend', print_file);
reader.readAsArrayBuffer(file);
}
function print_file(e){
let result=reader.result;
const uint8_view = new Uint8Array(result);
FS.writeFile('write_test.txt', uint8_view)
Module.ccall('print_file', 'number', ['string'], ['write_test.txt'])
}
print_input.cpp 打印文件以检查其是否有效:
#include <stdio.h>
extern "C" {
int print_file(char* file_path){
FILE *file = fopen(file_path, "r");
if (!file) {
printf("cannot open file\n");
return 1;
}
while (!feof(file)) {
char c = fgetc(file);
if (c != EOF) {
putchar(c);
}
}
return 0;
}
}
然后编译使用:
emcc print_input.cpp -o auto_em.js -s "EXPORTED_FUNCTIONS=['_print_file']" -s "EXTRA_EXPORTED_RUNTIME_METHODS=['ccall']" -s FORCE_FILESYSTEM=1