Tùy chọn tải xuống Flutter WEB


12

Tôi đang làm cho ứng dụng web rung nên tạo một tệp từ dữ liệu người dùng. Và có tùy chọn để tải tập tin đầu ra.

Nhưng tôi không thể tìm thấy bất kỳ tùy chọn / gói nào hoạt động cho web rung :(

Ai đó có thể vui lòng giúp tôi không?


Loại dữ liệu nào bạn muốn tải xuống CSV, Pdf, v.v.?
Deniz Bayar

Một vấn đề khác tôi gặp phải là sử dụng một cơ sở mã duy nhất cho ứng dụng Flutter và Web. Cố gắng biên dịch nó trên Flutter không giống như các dart:htmlplugin mà câu trả lời dưới đây có.
Suragch

này hữu ích cho trường hợp của bạn @Suragch?
Tiago Martins Peres 李大仁

1
@TiagoMartinsPeres, Mặc dù tôi không sử dụng Firebase, nhưng mã nguồn trong liên kết của câu trả lời rất thú vị. Cảm ơn bạn. Tôi đã hy vọng cho một giải pháp đơn giản hơn, nhưng Flutter Web vẫn đang trong giai đoạn thử nghiệm. Hy vọng các giải pháp đa nền tảng dễ dàng hơn sẽ được cung cấp trong tương lai.
Suragch

Câu trả lời:


3

Cách giải quyết tốt là mở tệp được lưu trữ trong tab mới bằng cách sử dụng

import 'dart:html' as html;

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

Phù hợp tốt cho trường hợp sử dụng của tôi.


Điều này hoạt động để tải xuống một tập tin APK. Nó không hoạt động để tải xuống tệp âm thanh vì tệp âm thanh bắt đầu phát tự động.
Suragch

Có, tôi cũng đang cố tải xuống tệp .json và tệp này cũng được mở bằng tab chrome. Thử xem có cách nào để sử dụng thẻ "tải xuống" trong html5 không.
Eradicatore

2

Mã đơn giản để chuyển hướng để tải xuống URL

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

1
Vì câu trả lời này đến muộn trong thời kỳ tiền thưởng, tôi không có thời gian để thử nó trước khi tiền thưởng hết hạn. Tuy nhiên, tôi sẽ cho rằng nó hoạt động (nhưng bạn có thể xác nhận rằng nó sẽ tải xuống tệp âm thanh mà không cần phát tự động không?). Tôi đang chọn câu trả lời này vì nó dễ hiểu.
Suragch

Điều này là đặc biệt cho web rung. Có sự thay thế nào cho ứng dụng di động không?
Razi Kallayi

Trong Android, bạn có thể tải xuống tệp từ url và lưu nó vào bộ nhớ điện thoại của mình bằng thư viện IO.
vishwajit76

1

Một cách để kích hoạt tải xuống là điều chỉnh một mẫu phổ biến được sử dụng trong javascript "gốc", tạo một phần tử neo với downloadthuộc tính và kích hoạt một nhấp chuột.

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

Đẹp. Tôi không biết gì về các mẫu được sử dụng trong javascript gốc, vì vậy tôi sẽ tìm hiểu thêm về điều này.
Suragch ngày


Wow cái này đã cứu tôi LỚN THỜI GIAN! Cảm ơn bạn rất nhiều. Mã này có thể tải xuống ngay một tệp pdf mà tôi đã tạo trong Flutter.
nipunasudha

0

Đáp ứng với tiền thưởng:

trường hợp của một tệp âm thanh, nó chỉ bắt đầu phát chứ không tải xuống

Tôi đã làm điều tương tự với video, nhưng tôi chắc chắn nó cũng sẽ hoạt động với âm thanh. Tôi giả sử, âm thanh được tạo của bạn là một mảng hoặc 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);
    }

Nếu tệp âm thanh là url thì http://www.example.com/my_audio.mp3sao?
Suragch

0

bạn có thể sử dụng gói url_launcher với url_launcher_web

sau đó bạn có thể làm:

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

EDIT: bạn không cần một plugin nếu bạn làm điều này

tải về

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

blank_doad.dart:

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

nhập khẩu và sử dụng:

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

void main () {
  download('I am a test file'.codeUnits, // takes bytes
      downloadName: 'test.txt');
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.