Преобразование вывода изображения FlutterWebImagePicker в файл

Я использую Flutter web для веб-приложения, и у меня возникают проблемы с преобразованием изображения из средства выбора изображений в файл, чтобы загрузить его на свой сервер. Я показываю изображение в Image.file (xxx), но получаю сообщение об ошибке:

Ошибка при попытке загрузить актив: FormatException: недопустимый символ схемы (в символе 6) Изображение (изображение:% 20MemoryImage (Uint8List% 234267a,% 20scale:% 201),% 20frameBuilder ...

Вот код, который я пытаюсь:

Future getImage(bool isCamera) async {

    Image image;

    if (isCamera) {
      image = await FlutterWebImagePicker.getImage;
    } else {
    }

     var bytes = await rootBundle.load('$image');
    String tempPath = (await getTemporaryDirectory()).path;
    File file = File('$tempPath/profile.png');

    await file.writeAsBytes(
        bytes.buffer.asUint8List(bytes.offsetInBytes, bytes.lengthInBytes));


    setState(() {
      currentSelfie = file;
      _accDetails['customer_selfie'] = currentSelfie;
    });
  }

заранее спасибо


person A True Novice    schedule 01.08.2020    source источник
comment
вы пытаетесь получить изображение из Finder / Windows Explorer? Для этого вам не нужна библиотека. Даже если вы пытаетесь получить изображение с ноутбука / телефона, это довольно просто. Если это так, дайте мне знать, и я опубликую полный процесс получения файла.   -  person Mariano Zorrilla    schedule 04.08.2020
comment
@marianoZorrilla у вас есть ссылка на полный процесс? Я просто получаю фото с мобильного устройства / рабочего стола   -  person A True Novice    schedule 10.08.2020


Ответы (2)


Я протестировал этот пакет и был очень доволен результатом. imagePickerWeb возвращает 3 разных типа, которые могут быть в виде изображения (виджет для предварительного просмотра), байта, файла (загрузка)

то вы можете использовать это, чтобы получить значения

 html.File _cloudFile;
 var _fileBytes;
 Image _imageWidget;
 
 Future<void> getMultipleImageInfos() async {
    var mediaData = await ImagePickerWeb.getImageInfo;
    String mimeType = mime(Path.basename(mediaData.fileName));
    html.File mediaFile =
        new html.File(mediaData.data, mediaData.fileName, {'type': mimeType});

    if (mediaFile != null) {
      setState(() {
        _cloudFile = mediaFile;
        _fileBytes = mediaData.data;
        _imageWidget = Image.memory(mediaData.data);
      });
    }
person Dean Villamia    schedule 04.08.2020
comment
и если вы собираетесь загрузить, используйте мой ответ здесь stackoverflow.com/questions/56252856/ - person Dean Villamia; 04.08.2020

Я не использовал плагин, хотя в вашем коде есть 2 проблемы. Один - это оператор if, а второй - использование Rootbundle. Если вы выбираете из файловой системы, мое предположение isCamera будет ложным. Вы не добавили никакой логики для условия ложности.

 if (isCamera) {// This would be true if the source was camera
  image = await FlutterWebImagePicker.getImage;
 } else {

 }

Кроме того,

var bytes = await rootBundle.load('$image');

Из документации по flutter, rootbundle содержит ресурсы, которые были упакованы с приложением, когда он был построен. Это активы, которые вы определяете в своей pubspec. ямл. Вы выбираете изображение во время выполнения, поэтому оно не входит в комплект в качестве ресурса.

Поскольку кажется, что пакет возвращает объект изображения, используйте toByteData метод на изображении т.е.

image = await FlutterWebImagePicker.getImage;
await image.toByteData();//This method has some parameters. Look into them
person Blacksmith    schedule 09.08.2020