Pilihan unduh WEB bergetar

12

Saya membuat aplikasi web bergetar yang seharusnya menghasilkan file dari data pengguna. Dan memiliki opsi untuk mengunduh file output.

Tapi saya tidak dapat menemukan opsi / paket yang berfungsi untuk flutter web :(

Bisakah seseorang tolong bantu saya?

Pratik
sumber
Jenis data apa yang ingin Anda unduh CSV, Pdf dll?
Deniz Bayar
Masalah lain yang saya alami adalah menggunakan basis kode tunggal untuk aplikasi Flutter dan Web. Mencoba mengompilasinya di Flutter tidak suka dart:htmlplugin yang memiliki jawaban di bawah ini.
Suragch
Apakah ini membantu kasus Anda @Suragch?
Tiago Martins Peres 李大仁
1
@TiagoMartinsPeres, Meskipun saya tidak menggunakan Firebase, kode sumber di tautan jawaban itu menarik. Terima kasih. Saya berharap untuk solusi yang lebih sederhana, tetapi Flutter Web masih dalam versi beta. Semoga solusi lintas platform lebih mudah akan disediakan di masa depan.
Suragch

Jawaban:

3

Solusi yang baik adalah membuka file yang dihosting di tab baru menggunakan

import 'dart:html' as html;

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

Cocok untuk kasus penggunaan saya.

Shashwat Aditya
sumber
Ini berfungsi untuk mengunduh file APK. Tidak berfungsi untuk mengunduh file audio karena file audio mulai diputar secara otomatis.
Suragch
Ya, saya juga mencoba mengunduh file .json dan file itu juga dibuka oleh tab chrome. Mencoba melihat apakah ada cara untuk menggunakan tag "unduh" di html5.
Eradicatore
2

Kode sederhana untuk mengarahkan ulang ke mengunduh URL

import 'dart:html' as html;
void downloadFile(String url){
   html.AnchorElement anchorElement =  new html.AnchorElement(href: url);
   anchorElement.download = url;
   anchorElement.click();
}
vishwajit76
sumber
1
Karena jawaban ini datang terlambat dalam periode hadiah saya tidak punya waktu untuk mencobanya sebelum hadiah berakhir. Namun, saya akan menganggap itu berfungsi (tetapi dapatkah Anda mengonfirmasi bahwa itu akan mengunduh file audio tanpa hanya memutarnya secara otomatis?). Saya memilih jawaban ini karena mudah dimengerti.
Suragch
Ini khusus untuk web bergetar. Apakah ada alternatif untuk aplikasi seluler?
Razi Kallayi
Di Android Anda dapat mengunduh file dari url dan menyimpannya ke penyimpanan ponsel menggunakan perpustakaan IO.
vishwajit76
1

Salah satu cara untuk memicu unduhan adalah mengadaptasi pola umum yang digunakan dalam javascript "asli", membuat elemen jangkar dengan downloadatribut dan memicu klik.

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
sumber
Bagus. Saya tidak tahu apa-apa tentang pola yang digunakan dalam javascript asli, jadi saya akan melihat lebih dalam.
Suragch
Wow yang ini menyelamatkan saya WAKTU BESAR! Terima kasih banyak. Kode ini dapat langsung mengunduh file pdf yang saya buat di Flutter.
nipunasudha
0

Respons terhadap karunia:

kasus file audio yang baru mulai diputar daripada mengunduhnya

Saya sudah melakukan hal yang sama dengan video, tapi saya yakin itu akan berfungsi dengan audio juga. Saya berasumsi, audio yang Anda hasilkan adalah array atau gumpalan

    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
sumber
Bagaimana jika file audio adalah url http://www.example.com/my_audio.mp3?
Suragch
0

Anda dapat menggunakan paket url_launcher dengan url_launcher_web

maka kamu bisa melakukan:

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

EDIT: Anda tidak perlu plugin jika Anda melakukan ini

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

impor dan gunakan:

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
sumber