【问题标题】:WebAssembly/emscripten: write files to disk from within browserWebAssembly/emscripten:从浏览器中将文件写入磁盘
【发布时间】:2019-01-27 13:57:19
【问题描述】:

我想在浏览器中执行一些 C 代码(使用 Firefox 64.0 进行测试)。 C 代码将文件写入磁盘。

我已经尝试使用 emscripten 的文件系统 API 好几个小时了,但我一无所获。

我读过这个relevant questionemscripten doc 声明相同:

  • 如果您的 C/C++ 代码确实使用文件,则将自动包含文件系统支持。

这是我使用文件系统的测试代码:

#include <stdio.h>
#include <stdlib.h>

int main() {
  FILE *f = fopen("testfile.txt", "w");
  if (f == NULL) {
      printf("Error opening file!\n");
      exit(1);
  }

  const char *text = "This is my test string";
  int i = 1234;
  fprintf(f, "Some text: %s; and an int: %d\n", text, i);

  fclose(f);
  printf("End of file.\n");
}

在我编译这段代码后:

emcc test.c -o test.html

然后用 Firefox 打开它,我最初希望文件会保存到我的机器上。 (我没有JS背景。) 我现在几乎可以肯定它不会那样工作。

该文件可通过以下方式作为 Uint8Array 访问:

var array = FS.readfile("testfile.txt")

在控制台中。

具体来说,我现在对此感兴趣:

  1. 有没有办法从浏览器内部将文件写入本地文件系统?
  2. 我可以通过某种方式下载创建的文件吗?

感谢您的宝贵时间。

【问题讨论】:

  • 使用 JavaScript,您可以设置下载链接并启动传统文件下载。 SO 有很多与如何使用 JavaScript 相关的答案。例如,这里有一个:stackoverflow.com/questions/32562347/…
  • 您不能通过 JavaScript 或 WebAssembly 将文件写入用户机器的浏览器。您可以为用户提供文件下载。您可以将数据保存在 IndexedDB 中。您可以将数据上传到服务器。但是,至少从 2019 年 1 月开始,您不能只写文件

标签: javascript fs emscripten webassembly


【解决方案1】:

TLDR; 永远不要指望你可以在浏览器上的机器上写任何东西。

现代网络浏览器在设计时考虑了安全性,因此它们是高度沙盒化的。他们永远不会允许网页在您的机器中写入/打开本地文件。想象一下有人访问了您的网站,然后在他们的机器中创建了一个名为 testfile.txt 的文件,并且每次您按下刷新按钮时网站都会不断创建文件。

WebAssembly 也不例外。它只是一个虚拟机,可以运行用 Javascript 以外的语言编写的代码。请记住,WebAssembly 是由 JavaScript 引擎运行的。所以说“我没有JS背景”。只是一个无效的陈述。 JS 做不到的就是 WebAssembly 做不到的。

根据Emscripten File System Overview 文档,您创建的文件将保留在内存中。您必须将其转换为 Blob(这必须使用 JavaScript API 完成)才能让用户下载.

【讨论】:

  • 这:永远不允许网页在您的机器上打开本地文件。这在最好的情况下是误导性的,在最坏的情况下是不准确的。请考虑改写以考虑到 JavaScript FileReader API
  • @RandyCasburn 不太一样。不同之处在于用户已通过&lt;input type="file"&gt; 元素明确授予浏览器对特定文件的访问权限,而问题是关于访问具有特定名称的磁盘上的文件。
  • 当然,我理解其中的区别,但是鉴于用户交互,您的陈述是直接的“永远不允许”是不正确的——此时浏览器会读取您机器中的本地文件。它是切碎的话,但可能会在将来阅读您的答案时误导某人。
猜你喜欢
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多