2017-11-15 6 views
0

私がwasmにコンパイルしたC++関数にユーザーが送信したデータを渡すことを検討しています。最後にフロントエンドからwebassemblyにクライアントファイルを渡す

handleFile(e){ 
    const file = e.currentTarget.files[0]; 
    const reader = new FileReader(); 
    reader.onloadend = evt => { 
     window.Module.readFile(evt.target.result); 
    } 
    reader.readAsArrayBuffer(file); 
} 

含む.cppファイル:

<input type="file" onChange={this.handleFile.bind(this)} /> 

のonChangeコールバックは現在、次のようになります。データには、同様に、ユーザは、入力タグを介してフロントエンドに提出するファイルでありますreadFileの機能は次のようになります。私は私がヒープ上にこれらのファイルのメモリを割り当て、その後にJSからPTRを渡すようになってることを知ってるよう

void readFile(const std::string & rawString){ 
    std::vector<uint8_t> data(rawString.begin(), rawString.end()); 
    //... 
} 

EMSCRIPTEN_BINDINGS(my_module) { 
    emscripten::function("readFile", &readFile); 
} 

私は、様々なドキュメントを読んで、私の午後を過ごすましたすべてのデータを渡す代わりにreadFileを使用します。私の問題は、そのすべてがどのように動作するはずか分かりません。誰かが説明できますか?

+0

の可能性の重複[WebAssembly関数からJavaScript文字列を返すにはどうすればいいですか?](https:// stackov erflow.com/questions/41353389/how-can-i-return-a-javascript-string-from-a-webassembly-function)。この他の質問で私が提供した答えは、WebAssemblyに文字列を入力/出力する方法を示しています。 –

+0

@JFBastienわかりません。私はwasm昨日 - > https://developer.mozilla.org/en-US/docs/WebAssembly/C_to_wasmを開始するためにこれらの指示に従ってきました。 .cppファイルをコンパイルすると、

0

Emscriptenでは、WASM用の仮想ファイルシステムを使用できます。 まず、-s FORCE_FILESYSTEM=1オプションを使用してC/C++コードをコンパイルします。 C/C++の中では、標準のライブラリ関数を使用して、通常どおりファイルを操作します。 HTMLページには、input type=file要素があります。

入力要素からファイルを取得し、WASMにそれを渡すためのサンプルJSコード:

function useFileInput(fileInput) { 
    if (fileInput.files.length == 0) 
     return; 
    var file = fileInput.files[0]; 

    var fr = new FileReader(); 
    fr.onload = function() { 
     var data = new Uint8Array(fr.result); 

     Module['FS_createDataFile']('/', 'filename', data, true, true, true); 
     Module.ccall('YourCppFunctionToUtilizeTheFile', null, [], null); 

     fileInput.value = ''; 
    }; 
    fr.readAsArrayBuffer(file); 
} 

リンク:

  1. Emscripten - File System Overview
  2. Here I use the approach, see emulatorAttachFileInput() function
関連する問題