Comment enregistrer et télécharger un fichier texte dans l'application Web Flutter

9

Je suis nouveau sur Flutter et je travaille dans une application Web Flutter. Mon exigence est de créer et de télécharger un fichier texte. comme ci-dessous.

void getData() {
    List<int> bytes = utf8.encode('this is the text file');
    print(bytes); // Need to download this with txt file.
}

Quelqu'un peut-il m'aider à y parvenir

Chinnu
la source

Réponses:

12

Cette méthode est basée sur des manipulations avec un HTMLdocument. Certains packages supplémentaires doivent être importés:

import 'dart:convert';
import 'dart:html' as html; // or package:universal_html/prefer_universal/html.dart

Extrait de code:

final text = 'this is the text file';

// prepare
final bytes = utf8.encode(text);
final blob = html.Blob([bytes]);
final url = html.Url.createObjectUrlFromBlob(blob);
final anchor = html.document.createElement('a') as html.AnchorElement
  ..href = url
  ..style.display = 'none'
  ..download = 'some_name.txt';
html.document.body.children.add(anchor);

// download
anchor.click();

// cleanup
html.document.body.children.remove(anchor);
html.Url.revokeObjectUrl(url);

Voici est DartPaddémo.

Spatz
la source
Merci! Ça fait un peu hacky mais ça marche. Malheureusement, je ne reçois pas la boîte de dialogue "Enregistrer sous" dans Chrome, il commence juste à télécharger un fichier. Et j'ai le paramètre "Demander où enregistrer chaque fichier avant le téléchargement" activé.
Oleksii Shliama
@OleksiiShliamenta Si vous regardez dans la bibliothèque FileSaver.js, elle fait exactement la même chose que Spatz a fait :). vérifiez ici . De plus, la boîte de dialogue Enregistrer sous apparaît pour moi en chrome. Cela pourrait être un problème de version ..?
Abhilash Chandran
8

Vous avez une autre façon de le faire, via la bibliothèque JS populaire appelée FileSaver

Tout d'abord, mettez à jour votre ProjectFolder/web/index.htmlfichier pour inclure la bibliothèque et définissez la webSaveAsfonction comme suit:

...

<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.8/FileSaver.min.js"> 
</script>

<script>
function webSaveAs(blob, name) {
  saveAs(blob, name);
}
</script>

<script src="main.dart.js" type="application/javascript"></script>

...

Ensuite, vous pouvez appeler cette fonction à partir du code Dart comme suit:

import 'dart:js' as js;
import 'dart:html' as html;

...

js.context.callMethod("webSaveAs", [html.Blob([bytes], "test.txt"])
Oleksii Shliama
la source
0

Cette solution utilise la bibliothèque FileSaver.js et devrait ouvrir la boîte de dialogue "saveAs".

J'espère que cela fonctionne comme prévu:

import 'dart:js' as js;
import 'dart:html' as html;

...

final text = 'this is the text file';
final bytes = utf8.encode(text);

final script = html.document.createElement('script') as html.ScriptElement;
script.src = "http://cdn.jsdelivr.net/g/filesaver.js";

html.document.body.nodes.add(script);

// calls the "saveAs" method from the FileSaver.js libray
js.context.callMethod("saveAs", [
  html.Blob([bytes]),
  "testText.txt",            //File Name (optional) defaults to "download"
  "text/plain;charset=utf-8" //File Type (optional)
]);

 // cleanup
 html.document.body.nodes.remove(script);
Seif Karoui
la source