Flutter WEB Download-Option


12

Ich mache eine flatternde Web-App, die eine Datei aus Benutzerdaten generieren soll. Und haben Sie die Möglichkeit, die Ausgabedatei herunterzuladen.

Aber ich kann keine Optionen / Pakete finden, die für Flatter Web funktionieren :(

Kann mir bitte jemand helfen?


Welche Art von Daten möchten Sie CSV, Pdf usw. herunterladen?
Deniz Bayar

Ein weiteres Problem ist die Verwendung einer einzigen Codebasis für die Flutter- und Web-App. Der Versuch, es auf Flutter zu kompilieren, mag die dart:htmlPlugins in den folgenden Antworten nicht.
Suragch

Ist das hilfreich für Ihren Fall @Suragch?
Tiago Martins Peres 10

1
@TiagoMartinsPeres, Obwohl ich Firebase nicht verwende, war der Quellcode im Link der Antwort interessant. Vielen Dank. Ich hatte auf eine einfachere Lösung gehofft, aber Flutter Web befindet sich noch in der Beta. Hoffentlich werden in Zukunft einfachere plattformübergreifende Lösungen angeboten.
Suragch

Antworten:


3

Eine gute Problemumgehung besteht darin, die gehostete Datei in einem neuen Tab mit zu öffnen

import 'dart:html' as html;

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

Passt gut zu meinem Anwendungsfall.


Dies funktioniert zum Herunterladen einer APK-Datei. Das Herunterladen einer Audiodatei funktioniert nicht, da die Audiodatei automatisch abgespielt wird.
Suragch

Ja, ich versuche auch, eine .json-Datei herunterzuladen, die ebenfalls über die Registerkarte "Chrome" geöffnet wird. Ich versuche zu sehen, ob es eine Möglichkeit gibt, das "Download" -Tag in HTML5 zu verwenden.
Eradicatore

2

Einfacher Code zum Umleiten zum Herunterladen der URL

import 'dart:html' as html;
void downloadFile(String url){
   html.AnchorElement anchorElement =  new html.AnchorElement(href: url);
   anchorElement.download = url;
   anchorElement.click();
}

1
Da diese Antwort spät in der Kopfgeldperiode kam, habe ich keine Zeit, sie zu versuchen, bevor das Kopfgeld abläuft. Ich gehe jedoch davon aus, dass es funktioniert (aber können Sie bestätigen, dass eine Audiodatei heruntergeladen wird, ohne sie nur automatisch abzuspielen?). Ich wähle diese Antwort, weil sie leicht zu verstehen ist.
Suragch

Dies ist speziell für Flatterbahn. Gibt es eine Alternative für die mobile App?
Razi Kallayi

In Android können Sie Dateien von der URL herunterladen und mithilfe der E / A-Bibliothek auf Ihrem Telefonspeicher speichern.
vishwajit76

1

Eine Möglichkeit, den Download auszulösen, besteht darin, ein allgemeines Muster anzupassen, das in "nativem" Javascript verwendet wird, ein Ankerelement mit dem downloadAttribut zu erstellen und einen Klick auszulösen.

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

Nett. Ich weiß nichts über Muster, die in nativem Javascript verwendet werden, daher werde ich mich näher damit befassen.
Suragch


Wow, das hat mir GROSSE ZEIT gerettet! Ich danke dir sehr. Dieser Code könnte sofort eine PDF-Datei herunterladen, die ich in Flutter generiert habe.
Nipunasudha

0

Antwort auf Kopfgeld:

Bei einer Audiodatei wird sie nur abgespielt, anstatt sie herunterzuladen

Ich habe dasselbe mit Video gemacht, aber ich bin sicher, dass es auch mit Audio funktionieren wird. Ich gehe davon aus, dass Ihr generiertes Audio ein Array oder ein Blob ist

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

Was ist, wenn die Audiodatei URL ist http://www.example.com/my_audio.mp3?
Suragch

0

Sie können das Paket url_launcher mit url_launcher_web verwenden

dann können Sie tun:

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

EDIT: Sie benötigen kein Plugin, wenn Sie dies tun

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 und Verwendung:

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

void main () {
  download('I am a test file'.codeUnits, // takes bytes
      downloadName: 'test.txt');
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.