Opção de download WEB Flutter

12

Estou criando o aplicativo da web vibração que deve gerar um arquivo a partir dos dados do usuário. E tem a opção de baixar o arquivo de saída.

Mas não consigo encontrar opções / pacotes que funcionem para o flutter web :(

Alguém por favor pode me ajudar?

Pratik
fonte
Que tipo de dados você deseja baixar CSV, Pdf etc?
Deniz Bayar
Outro problema que estou tendo é usar uma única base de código para o aplicativo Flutter and Web. Tentar compilá-lo no Flutter não gosta dos dart:htmlplugins que as respostas abaixo têm.
Suragch 5/03
É isso útil para o seu caso @Suragch?
Tiago Martins Peres 李大仁 10/03
11
@TiagoMartinsPeres, Embora não esteja usando o Firebase, o código-fonte no link da resposta foi interessante. Obrigado. Eu esperava uma solução mais simples, mas o Flutter Web ainda está na versão beta. Esperamos que soluções multiplataforma mais fáceis sejam fornecidas no futuro.
Suragch 11/03

Respostas:

3

Uma boa solução é abrir o arquivo hospedado em uma nova guia usando

import 'dart:html' as html;

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

Adapta-se bem ao meu caso de uso.

Shashwat Aditya
fonte
Isso funciona para baixar um arquivo APK. Não funciona para baixar um arquivo de áudio porque o arquivo começa a ser reproduzido automaticamente.
Suragch
Sim, também estou tentando baixar um arquivo .json e ele também é aberto pela guia chrome. Tentando ver se há alguma maneira de usar a tag "download" no html5.
Eradicatore
2

Código simples para redirecionar para o URL de download

import 'dart:html' as html;
void downloadFile(String url){
   html.AnchorElement anchorElement =  new html.AnchorElement(href: url);
   anchorElement.download = url;
   anchorElement.click();
}
vishwajit76
fonte
11
Como essa resposta chegou no final do período de recompensa, não tenho tempo para experimentá-la antes que a recompensa expire. No entanto, suponho que funcione (mas você pode confirmar que faria o download de um arquivo de áudio sem apenas reproduzi-lo automaticamente?). Estou escolhendo esta resposta porque é fácil de entender.
Suragch 11/03
Isso é especificamente para a Web de vibração. Existe alguma alternativa para aplicativo móvel?
Razi Kallayi 17/04
No Android, você pode baixar o arquivo do URL e salvá-lo no armazenamento do telefone usando a biblioteca IO.
vishwajit76 19/04
1

Uma maneira de acionar o download é adaptar um padrão comum usado no javascript "nativo", criar um elemento âncora com o downloadatributo e acionar um clique.

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
fonte
Agradável. Não sei nada sobre os padrões usados ​​no javascript nativo, por isso analisarei mais a fundo.
Suragch 03/03
Uau, esse me salvou MUITO TEMPO! Muito obrigado. Esse código pode fazer o download instantâneo de um arquivo pdf que eu gerei no Flutter.
nipunasudha 21/04
0

Resposta à recompensa:

no caso de um arquivo de áudio, ele apenas começa a ser reproduzido, em vez de baixá-lo

Fiz a mesma coisa com o vídeo, mas tenho certeza de que também funcionará com áudio. Presumo que o áudio gerado seja um array ou 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
fonte
E se o arquivo de áudio for url http://www.example.com/my_audio.mp3?
Suragch 5/03
0

você pode usar o pacote url_launcher com url_launcher_web

então você pode fazer:

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

EDIT: você não precisa de um plugin se fizer isso

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

importar e usar:

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
fonte