Опция загрузки Flutter WEB - PullRequest
       68

Опция загрузки Flutter WEB

12 голосов
/ 17 января 2020

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

Но я не могу найти какие-либо опции / пакеты, которые работают для веб-флаттера :(

Может кто-нибудь, пожалуйста, помогите мне?

Ответы [ 5 ]

3 голосов
/ 29 февраля 2020

Хороший обходной путь - открыть размещенный файл в новой вкладке, используя

import 'dart:html' as html;

openInANewTab(url){
  html.window.open(url, 'PlaceholderName');
}

Хорошо подходит для моего варианта использования.

2 голосов
/ 10 марта 2020

Простой код для перенаправления на скачивание URL

import 'dart:html' as html;
void downloadFile(String url){
   html.AnchorElement anchorElement =  new html.AnchorElement(href: url);
   anchorElement.download = url;
   anchorElement.click();
}
1 голос
/ 03 марта 2020

Одним из способов запуска загрузки является адаптация общего шаблона, используемого в «нативном» javascript, создание элемента привязки с атрибутом download и запуск щелчка.

import 'dart:convert';
import 'dart:html';

main() {
  File file = // generated somewhere
  final rawData = file.readAsBytesSync();
  final content = base64Encode(rawData);
  final anchor = AnchorElement(
      href: "data:application/octet-stream;charset=utf-16le;base64,$content")
    ..setAttribute("download", "file.txt")
    ..click();
}

0 голосов
/ 29 апреля 2020

вы можете использовать пакет url_launcher с url_launcher_web

, тогда вы можете сделать:

launch("data:application/octet-stream;base64,${base64Encode(yourFileBytes)}")

РЕДАКТИРОВАТЬ: вам не нужен плагин, если вы делаете это

download.dart:

import 'dart:convert';
// ignore: avoid_web_libraries_in_flutter
import 'dart:html';

void download(
  List<int> bytes, {
  String downloadName,
}) {
  // Encode our file in base64
  final _base64 = base64Encode(bytes);
  // Create the link with the file
  final anchor =
      AnchorElement(href: 'data:application/octet-stream;base64,$_base64')
        ..target = 'blank';
  // add the name
  if (downloadName != null) {
    anchor.download = downloadName;
  }
  // trigger download
  document.body.append(anchor);
  anchor.click();
  anchor.remove();
  return;
}

empty_download.dart:

void download(
  List<int> bytes, {
  String downloadName,
}) {
  print('I do nothing');
}

импорт и использование:

import 'empty_download.dart'
if (dart.library.html) 'download.dart';

void main () {
  download('I am a test file'.codeUnits, // takes bytes
      downloadName: 'test.txt');
}
0 голосов
/ 04 марта 2020

Ответ на награду:

в случае аудиофайла, который он только начинает воспроизводить, а не загружает его

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

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

    const mimeType = 'audio/wav'; // TODO: Pick a right format

    void downloadFile(List chunks) async {
        final blob = HTML.Blob(chunks, mimeType);
        final objectUrl = await HTML.Url.createObjectUrlFromBlob(blob);
        final a = HTML.AnchorElement();
        a.href = item.url;
        a.download = "my_audio_file_${DateTime.now()}.wav";
        HTML.document.body.append(a);
        a.click();
        // Wait for click event to be processed and cleanup
        await Future.delayed(Duration(milliseconds: 100));
        a.remove();
        HTML.Url.revokeObjectUrl(item.videoObjectUrl);
    }
...