From 4ec4d616569f7f57f2fa815b7f0db49f06eeffb3 Mon Sep 17 00:00:00 2001 From: lifegpc Date: Sat, 9 Sep 2023 13:13:16 +0800 Subject: [PATCH] Impl saveFile for web --- lib/platform/path.dart | 5 +++++ lib/platform/save_file.dart | 1 + lib/platform/save_file_none.dart | 6 ++++++ lib/platform/save_file_web.dart | 28 ++++++++++++++++++++++++++++ 4 files changed, 40 insertions(+) create mode 100644 lib/platform/save_file.dart create mode 100644 lib/platform/save_file_none.dart create mode 100644 lib/platform/save_file_web.dart diff --git a/lib/platform/path.dart b/lib/platform/path.dart index bc7770a..1c01687 100644 --- a/lib/platform/path.dart +++ b/lib/platform/path.dart @@ -1,7 +1,9 @@ import 'dart:async'; +import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import 'package:logging/logging.dart'; import '../utils.dart'; +import 'save_file.dart'; final Logger _log = Logger("platformPath"); @@ -31,6 +33,9 @@ class Path { Future saveFile( String filenameWithoutExtension, String mimeType, Uint8List bytes, {String dir = ""}) async { + if (kIsWeb) { + return saveFileWeb(bytes, mimeType, filenameWithoutExtension); + } return _safChannel.invokeMethod( "saveFile", [filenameWithoutExtension, dir, mimeType, bytes]); } diff --git a/lib/platform/save_file.dart b/lib/platform/save_file.dart new file mode 100644 index 0000000..406ac07 --- /dev/null +++ b/lib/platform/save_file.dart @@ -0,0 +1 @@ +export 'save_file_none.dart' if (dart.library.html) 'save_file_web.dart'; diff --git a/lib/platform/save_file_none.dart b/lib/platform/save_file_none.dart new file mode 100644 index 0000000..5181ed2 --- /dev/null +++ b/lib/platform/save_file_none.dart @@ -0,0 +1,6 @@ +import 'dart:typed_data'; + +void saveFileWeb( + Uint8List data, String mimeType, String filenameWithoutExtension) { + throw UnimplementedError(); +} diff --git a/lib/platform/save_file_web.dart b/lib/platform/save_file_web.dart new file mode 100644 index 0000000..6e66c45 --- /dev/null +++ b/lib/platform/save_file_web.dart @@ -0,0 +1,28 @@ +// ignore: avoid_web_libraries_in_flutter +import 'dart:html'; +import 'dart:typed_data'; + +void saveFileWeb( + Uint8List data, String mimeType, String filenameWithoutExtension) { + final blob = Blob([data], mimeType); + final url = Url.createObjectUrlFromBlob(blob); + final a = document.createElement("a") as AnchorElement; + a.href = url; + var ext = ""; + switch (mimeType) { + case "image/jpeg": + ext = ".jpg"; + break; + case "image/png": + ext = ".png"; + break; + case "image/gif": + ext = ".gif"; + break; + default: + break; + } + a.download = "$filenameWithoutExtension$ext"; + a.click(); + Url.revokeObjectUrl(url); +}