Emscripten:主动下载/保存生成的文件MEMFS

时间:2019-01-31 18:14:40

标签: emscripten

我正在玩emscripten,并编译了我的旧模拟器程序以在浏览器中运行。

该程序将输出保存为数据文件,由于我没有做任何特别的事情,因此应将其驻留在MEMFS(内存文件系统)上。

如何让用户从MEMFS下载得到的文件?我可以触发浏览器的常规保存文件对话框吗?

1 个答案:

答案 0 :(得分:0)

知道了

  • 在编译过程中将FS添加到EXTRA_EXPORTED_RUNTIME_METHODS。
[
    { "abc": 4 },
    { "def": 4 },
    { "hij": 5 },
    { "klm": 3 },
    { "nop": 2 },
]
  • 将以下功能添加到您的.html或.js文件中。
$ emcc --bind -std=c++11 \
       -s EXTRA_EXPORTED_RUNTIME_METHODS=FS \
       -o main.js *.cpp 
  • 在postRun上调用功能(选项1):
function offerFileAsDownload(filename, mime) {
  mime = mime || "application/octet-stream";

  let content = Module.FS.readFile(filename);
  console.log(`Offering download of "${filename}", with ${content.length} bytes...`);

  var a = document.createElement('a');
  a.download = filename;
  a.href = URL.createObjectURL(new Blob([content], {type: mime}));
  a.style.display = 'none';

  document.body.appendChild(a);
  a.click();
  setTimeout(() => {
    document.body.removeChild(a);
    URL.revokeObjectURL(a.href);
  }, 2000);
}
  • 在C ++代码末尾调用函数(选项2):
<script>
// This must go BEFORE sourcing main.js:
var Module = {
  onRuntimeInitialized: () => {
    Module.postRun.push(() => offerFileAsDownload("filename.ext", "mime/type"));
  }
};
</script>
<script src="main.js"></script>