Как сохранить и скачать текстовый файл в веб-приложении Flutter

9

Я новичок во Flutter и работаю в веб-приложении, мне нужно создать и загрузить текстовый файл. как ниже.

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

Может ли кто-нибудь помочь мне достичь этого

Chinnu
источник

Ответы:

12

Этот метод основан на манипуляциях с HTMLдокументом. Некоторые дополнительные пакеты должны быть импортированы:

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

Фрагмент кода:

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);

Вот это DartPadдемо.

Spatz
источник
Спасибо! Это кажется немного хакерским, но это работает. К сожалению, я не получаю диалоговое окно «Сохранить как» в Chrome, оно просто начинает загрузку файла. И у меня есть настройка «Спросите, где сохранить каждый файл перед загрузкой».
Алексей Шляма
@OleksiiShliama Если вы загляните в библиотеку FileSaver.js, то на самом деле она делает то же самое, что и Spatz :). проверьте здесь . Кроме того, диалоговое окно сохранения как отображается для меня в Chrome. Может быть проблема версии ..?
Абхилаш Чандран
8

Есть другой способ сделать это через популярную библиотеку JS под названием FileSaver

Сначала обновите ваш ProjectFolder/web/index.htmlфайл, чтобы включить библиотеку, и определите webSaveAsфункцию следующим образом:

...

<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>

...

Затем вы можете вызвать эту функцию из кода Dart следующим образом:

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

...

js.context.callMethod("webSaveAs", [html.Blob([bytes], "test.txt"])
Алексей Шляма
источник
0

Это решение использует библиотеку FileSaver.js и должно открыть диалоговое окно «saveAs».

Я надеюсь, что это работает как задумано:

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);
Сейф Каруи
источник