5 votes

WebAssembly/emscripten : écrire des fichiers sur le disque à partir du navigateur

J'ai un code C que je voudrais exécuter dans un navigateur (testé avec Firefox 64.0). Le code C écrit un fichier sur le disque.

J'essaie d'utiliser l'API du système de fichiers d'emscripten depuis de nombreuses heures maintenant et je n'arrive à rien.

J'ai lu ceci question pertinente et le emscripten doc déclare la même chose :

  • si votre code C/C++ utilise des fichiers, le support du système de fichiers sera automatiquement inclus.

Voici mon code de test qui utilise le système de fichiers :

#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");
}

Après avoir compilé ce code avec :

emcc test.c -o test.html

En l'ouvrant avec Firefox, je m'attendais initialement à ce que le fichier soit enregistré sur ma machine. (Je n'ai pas d'expérience en JS). Je suis maintenant presque certain que cela ne fonctionne pas comme cela.

Le fichier est accessible en tant que Uint8Array via :

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

dans la console.

Plus précisément, je m'intéresse maintenant à ceci :

  1. Existe-t-il un moyen d'écrire un fichier dans mon système de fichiers local à partir du navigateur ?
  2. Puis-je télécharger le fichier créé d'une manière ou d'une autre ?

Merci pour votre temps.

2voto

Bumsik Kim Points 632

TLDR ; Ne vous attendez jamais à pouvoir écrire quoi que ce soit dans votre machine sur un navigateur.

Les navigateurs web modernes sont conçus dans un souci de sécurité et sont donc fortement protégés par des bacs à sable. Ils ne permettront jamais aux pages web d'écrire/ouvrir un fichier local sur votre machine. Imaginez que quelqu'un visite votre site Web et qu'un fichier appelé testfile.txt est créé dans leur machine, et le site web continue à créer des fichiers chaque fois que vous appuyez sur le bouton d'actualisation.

WebAssembly ne fait pas exception. Il s'agit simplement d'une machine virtuelle permettant d'exécuter du code écrit dans des langages autres que Javascript. N'oubliez pas que WebAssembly est exécuté par un moteur JavaScript. Par conséquent, dire "Je n'ai pas de connaissances en JavaScript" est tout simplement une déclaration invalide. Ce que JS ne peut pas faire est ce que WebAssembly ne peut pas faire.

Selon le Présentation du système de fichiers Emscripten la documentation, le Les fichiers que vous créez resteront dans la mémoire. Vous devez le convertir en Blob (cela doit être fait en utilisant l'API JavaScript) pour permettre aux utilisateurs de télécharger.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X