如何将HTML输入的文件加载到Emscripten的MEMFS文件系统中?

问题描述 投票:0回答:1

我有一个类似<input type="file" id="myfile" onchange="load_file()">的HTML输入。我想将文件加载到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));

但是当我尝试读取文件时,收到“没有这样的文件或目录”错误消息。

关于我要去哪里的任何建议?

javascript webassembly emscripten
1个回答
0
投票

这是我最后要做的–

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
© www.soinside.com 2019 - 2024. All rights reserved.