本文主要描述一种empscritpen开发体系下,怎么将文件保存到本地的方法。本文描述方法参考https://groups.google.com/forum/#!topic/emscripten-discuss/xnTzhcsMj4U实现,亲测可行。
empscripten是一款编译器,他负责把clang编译的bitcode转换为符合asm.js或者webAssembly规范的js代码,这样可以使得大量的c/cpp库直接在web上运行,避免了反复开发。更多的概念不是本文描述的重点,所以不深入说明,请到官网查看emscripten.org。
js代码运行在浏览器的sandbox模型中,无法操作本地文件,所以emscripten中file system API的操作皆为sandbox中操作,那么想要把文件保存到本地怎么办?当然想到的自然是从sandbox中下载文件,此方法行之有效,流程简单。至于其他的如local storage经反复权衡后还是采用从沙盒下载的方法。
实现方式如下:
1.下载js文件到网站https://github.com/eligrey/FileSaver.js,网站怎么部署请自行查询。
2.在html页加入以下代码
<script src="FileSaver.js"> </script>
<script>
function saveFileFromMemoryFSToDisk(memoryFSname,localFSname) // This can be called by C++ code
{
var data=FS.readFile(memoryFSname);
var blob;
var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
if(isSafari) {
blob = new Blob([data.buffer], {type: "application/octet-stream"});
} else {
blob = new Blob([data.buffer], {type: "application/octet-binary"});
}
saveAs(blob, localFSname);
}
</script>
3.在c++代码中调用2处的方法
emscripten_run_script("saveFileFromMemoryFSToDisk('/binaryfile','binaryfile')");
执行后会在浏览器提示下载文件,保存到本地即可。本着拿来使用的原则并未深究FileServer.js,估计是点击URL下载资源的方式,网上已有提供此思路从sandbox下载文件,只是FileServer.js让我们少写一些代码。