2020-09-07 19:06:18 +00:00
|
|
|
import 'dart:async';
|
|
|
|
import 'dart:convert';
|
|
|
|
import 'dart:html' as html;
|
2020-09-11 13:53:18 +00:00
|
|
|
import 'dart:typed_data';
|
2020-09-07 19:06:18 +00:00
|
|
|
|
|
|
|
import 'package:file_picker/file_picker.dart';
|
|
|
|
import 'package:flutter_web_plugins/flutter_web_plugins.dart';
|
|
|
|
|
|
|
|
import 'file_picker_result.dart';
|
|
|
|
import 'platform_file.dart';
|
|
|
|
|
|
|
|
class FilePickerWeb extends FilePicker {
|
|
|
|
FilePickerWeb._();
|
|
|
|
static final FilePickerWeb platform = FilePickerWeb._();
|
|
|
|
|
|
|
|
static void registerWith(Registrar registrar) {
|
2020-09-11 13:53:18 +00:00
|
|
|
FilePicker.platform = platform;
|
2020-09-07 19:06:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
Future<FilePickerResult> pickFiles({
|
|
|
|
FileType type = FileType.any,
|
|
|
|
List<String> allowedExtensions,
|
|
|
|
bool allowMultiple = false,
|
|
|
|
Function(FilePickerStatus) onFileLoading,
|
|
|
|
bool allowCompression,
|
2020-09-11 17:01:34 +00:00
|
|
|
bool withData = true,
|
2020-09-07 19:06:18 +00:00
|
|
|
}) async {
|
2020-09-11 17:37:45 +00:00
|
|
|
final Completer<List<PlatformFile>> filesCompleter =
|
|
|
|
Completer<List<PlatformFile>>();
|
2020-09-07 19:06:18 +00:00
|
|
|
|
|
|
|
String accept = _fileType(type, allowedExtensions);
|
|
|
|
html.InputElement uploadInput = html.FileUploadInputElement();
|
|
|
|
uploadInput.draggable = true;
|
|
|
|
uploadInput.multiple = allowMultiple;
|
|
|
|
uploadInput.accept = accept;
|
|
|
|
uploadInput.click();
|
|
|
|
|
|
|
|
uploadInput.onChange.listen((e) {
|
|
|
|
final files = uploadInput.files;
|
|
|
|
final reader = html.FileReader();
|
|
|
|
|
|
|
|
List<PlatformFile> pickedFiles = [];
|
|
|
|
|
|
|
|
reader.onLoadEnd.listen((e) {
|
2020-09-11 17:37:45 +00:00
|
|
|
final Uint8List bytes =
|
|
|
|
Base64Decoder().convert(reader.result.toString().split(",").last);
|
2020-09-11 13:53:18 +00:00
|
|
|
|
2020-09-07 19:06:18 +00:00
|
|
|
pickedFiles.add(
|
|
|
|
PlatformFile(
|
|
|
|
name: uploadInput.value.replaceAll('\\', '/'),
|
2020-09-11 13:53:18 +00:00
|
|
|
path: uploadInput.value,
|
|
|
|
size: bytes.length ~/ 1024,
|
2020-09-11 17:01:34 +00:00
|
|
|
bytes: withData ? bytes : null,
|
2020-09-07 19:06:18 +00:00
|
|
|
),
|
|
|
|
);
|
|
|
|
|
|
|
|
if (pickedFiles.length >= files.length) {
|
|
|
|
filesCompleter.complete(pickedFiles);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
files.forEach((element) {
|
|
|
|
reader.readAsDataUrl(element);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
return FilePickerResult(await filesCompleter.future);
|
|
|
|
}
|
|
|
|
|
|
|
|
static String _fileType(FileType type, List<String> allowedExtensions) {
|
|
|
|
switch (type) {
|
|
|
|
case FileType.any:
|
|
|
|
return '';
|
|
|
|
|
|
|
|
case FileType.audio:
|
|
|
|
return 'audio/*';
|
|
|
|
|
|
|
|
case FileType.image:
|
|
|
|
return 'image/*';
|
|
|
|
|
|
|
|
case FileType.video:
|
|
|
|
return 'video/*';
|
|
|
|
|
|
|
|
case FileType.media:
|
|
|
|
return 'video/*|image/*';
|
|
|
|
|
|
|
|
case FileType.custom:
|
2020-09-11 17:37:45 +00:00
|
|
|
return allowedExtensions.fold(
|
|
|
|
'', (prev, next) => '${prev.isEmpty ? '' : '$prev,'} .$next');
|
2020-09-07 19:06:18 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
return '';
|
|
|
|
}
|
|
|
|
}
|