Flutter WEB 다운로드 옵션


12

사용자 데이터에서 파일을 생성 해야하는 flutter 웹 앱을 만들고 있습니다. 출력 파일을 다운로드 할 수있는 옵션이 있습니다.

그러나 플러터 웹에서 작동하는 옵션 / 패키지를 찾을 수 없습니다 :(

누군가 제발 도와주세요?


어떤 종류의 데이터를 CSV, PDF 등을 다운로드 하시겠습니까?
Deniz Bayar

내가 겪고있는 또 다른 문제는 Flutter 및 Web 앱에 단일 코드베이스를 사용하는 것입니다. Flutter에서 컴파일하려고 시도하는 것은 dart:html아래 답변에 있는 플러그인을 좋아하지 않습니다 .
Suragch

사건 @Suragch에 도움이?
Tiago Martins Peres 李大仁

1
@TiagoMartinsPeres, Firebase를 사용하지 않지만 답변 링크의 소스 코드는 흥미 롭습니다. 감사합니다. 더 간단한 솔루션을 원했지만 Flutter Web은 아직 베타 버전입니다. 앞으로 더 쉬운 크로스 플랫폼 솔루션이 제공 될 것입니다.
Suragch

답변:


3

좋은 해결 방법은 다음을 사용하여 호스팅 된 파일을 새 탭에서 여는 것입니다.

import 'dart:html' as html;

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

내 유스 케이스에 적합합니다.


APK 파일을 다운로드 할 때 사용합니다. 오디오 파일이 자동으로 재생되기 때문에 오디오 파일을 다운로드 할 수 없습니다.
Suragch

예, 또한 .json 파일을 다운로드하려고하는데 크롬 탭에 의해 열립니다. html5에서 "download"태그를 사용하는 방법이 있는지 확인하려고합니다.
Eradicatore

2

다운로드 URL로 리디렉션하기위한 간단한 코드

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

1
이 답변은 현상금 기간이 늦었으므로 현상금이 만료되기 전에 시도해 볼 시간이 없습니다. 그러나 나는 그것이 작동한다고 가정 할 것입니다 (그러나 오디오 파일을 자동으로 재생하지 않고 다운로드 할 수 있습니까?) 이해하기 쉽기 때문에이 답변을 선택하고 있습니다.
Suragch

이것은 플러터 웹 전용입니다. 모바일 앱에 대한 대안이 있습니까?
Razi Kallayi

안드로이드에서는 URL에서 파일을 다운로드하여 IO 라이브러리를 사용하여 휴대 전화 저장 장치에 저장할 수 있습니다.
vishwajit76

1

다운로드를 트리거하는 한 가지 방법은 "네이티브"자바 스크립트에서 사용되는 공통 패턴을 조정하고 download속성이 있는 앵커 요소를 작성 하고 클릭을 트리거하는 것입니다.

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

좋은. 네이티브 자바 스크립트에서 사용되는 패턴에 대해서는 아무것도 모르므로 자세히 살펴 보겠습니다.
Suragch


와우, 이것 하나가 나를 크게 구했다! 정말 고맙습니다. 이 코드는 Flutter에서 생성 한 pdf 파일을 즉시 다운로드 할 수 있습니다.
nipunasudha

0

현상금에 대한 답변 :

오디오 파일의 경우 다운로드하는 대신 재생을 시작합니다.

비디오와 동일한 작업을 수행했지만 오디오에서도 작동합니다. 생성 된 오디오는 배열 또는 얼룩이라고 가정합니다.

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

오디오 파일이 URL 인 경우 http://www.example.com/my_audio.mp3어떻게합니까?
Suragch

0

url_launcher_web과 함께 url_launcher 패키지를 사용할 수 있습니다

그럼 당신은 할 수 있습니다 :

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

편집 :이 작업을 수행하면 플러그인이 필요하지 않습니다

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 'empty_download.dart'
if (dart.library.html) 'download.dart';

void main () {
  download('I am a test file'.codeUnits, // takes bytes
      downloadName: 'test.txt');
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.