WebAssembly / emscripten: записывать файлы на диск из браузера - PullRequest
0 голосов
/ 27 января 2019

У меня есть код на C, который я хотел бы выполнить в браузере (тестирование с Firefox 64.0).Код C записывает файл на диск.

Я уже много часов пытаюсь использовать API файловой системы emscripten, и ничего не получаю.

Я прочитал это соответствующий вопрос и emscripten 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. Можно ли загрузить созданноефайл каким-то образом?

Спасибо за ваше время.

1 Ответ

0 голосов
/ 27 января 2019

TLDR; Никогда не ожидайте, что вы можете написать что-нибудь на своем компьютере в браузере.

Современные веб-браузеры спроектированы с учетом требований безопасности, поэтому они сильно изолированы. Они никогда не позволят веб-страницам записывать / открывать локальный файл на вашем компьютере. Представьте, что кто-то посещает ваш сайт, а затем на его компьютере создается файл с именем testfile.txt, и веб-сайт продолжает создавать файлы каждый раз, когда вы нажимаете кнопку обновления.

WebAssembly не имеет исключений. Это просто виртуальная машина для запуска кода, написанного на языках, отличных от Javascript. Имейте в виду, что WebAssembly запускается движком JavaScript. Сказав: «У меня нет опыта в JS». это просто неверное утверждение. JS не может сделать то, что не может WebAssembly.

В соответствии с документацией Обзор файловой системы Emscripten созданные вами файлы останутся в памяти. Необходимо преобразовать их в Blob (это должно быть сделано с использованием JavaScript API). ), чтобы позволить пользователям загружать.

...