Option de téléchargement Flutter WEB

12

Je crée une application Web flottante qui devrait générer un fichier à partir des données utilisateur. Et avez la possibilité de télécharger le fichier de sortie.

Mais je ne trouve pas d'options / packages qui fonctionnent pour flutter web :(

Quelqu'un peut-il m'aider?

Pratik
la source
Quel type de données souhaitez-vous télécharger CSV, Pdf, etc.?
Deniz Bayar
Un autre problème que j'ai est d'utiliser une seule base de code pour l'application Flutter et Web. Essayer de le compiler sur Flutter n'aime pas les dart:htmlplugins que les réponses ci-dessous ont.
Suragch
Est- ce utile pour votre cas @Suragch?
Tiago Martins Peres
1
@TiagoMartinsPeres, Bien que je n'utilise pas Firebase, le code source dans le lien de la réponse était intéressant. Je vous remercie. J'espérais une solution plus simple, mais Flutter Web est toujours en version bêta. Espérons que des solutions multiplateformes plus simples seront proposées à l'avenir.
Suragch

Réponses:

3

Une bonne solution consiste à ouvrir le fichier hébergé dans un nouvel onglet à l'aide de

import 'dart:html' as html;

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

Convient bien à mon cas d'utilisation.

Shashwat Aditya
la source
Cela fonctionne pour le téléchargement d'un fichier APK. Cela ne fonctionne pas pour le téléchargement d'un fichier audio car le fichier audio démarre automatiquement.
Suragch
Oui, j'essaie également de télécharger un fichier .json et il est également ouvert par l'onglet Chrome. Essayer de voir s'il existe un moyen d'utiliser la balise "download" en html5.
Eradicatore
2

Code simple pour rediriger vers l'URL de téléchargement

import 'dart:html' as html;
void downloadFile(String url){
   html.AnchorElement anchorElement =  new html.AnchorElement(href: url);
   anchorElement.download = url;
   anchorElement.click();
}
vishwajit76
la source
1
Étant donné que cette réponse est arrivée tard dans la période de prime, je n'ai pas le temps de l'essayer avant l'expiration de la prime. Cependant, je suppose que cela fonctionne (mais pouvez-vous confirmer qu'il téléchargerait un fichier audio sans le lire automatiquement?). Je choisis cette réponse car elle est facile à comprendre.
Suragch
Ceci est spécifiquement pour le Web flottant. Existe-t-il une alternative pour l'application mobile?
Razi Kallayi
Dans Android, vous pouvez télécharger le fichier depuis l'URL et l'enregistrer sur le stockage de votre téléphone à l'aide de la bibliothèque IO.
vishwajit76
1

Une façon de déclencher le téléchargement est d'adapter un modèle commun utilisé en javascript "natif", de créer un élément d'ancrage avec l' downloadattribut et de déclencher un clic.

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();
}
DaGardner
la source
Agréable. Je ne sais rien des modèles utilisés en javascript natif, je vais donc approfondir cela.
Suragch
Wow celui-ci m'a fait gagner beaucoup de temps! Merci beaucoup. Ce code pourrait télécharger instantanément un fichier pdf que j'ai généré dans Flutter.
nipunasudha
0

Réponse à la prime:

le cas d'un fichier audio, il commence juste à jouer plutôt que de le télécharger

J'ai fait la même chose avec la vidéo, mais je suis sûr que cela fonctionnera également avec l'audio. Je suppose que votre audio généré est un tableau ou un blob

    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);
    }
Dima Rostopira
la source
Que faire si le fichier audio est une URL http://www.example.com/my_audio.mp3?
Suragch
0

vous pouvez utiliser le package url_launcher avec url_launcher_web

alors vous pouvez faire:

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

EDIT: vous n'avez pas besoin d'un plugin si vous le faites

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

importer et utiliser:

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

void main () {
  download('I am a test file'.codeUnits, // takes bytes
      downloadName: 'test.txt');
}
pinguinitorawr
la source