Преобразование вывода изображения FlutterWebImagePicker в файл - PullRequest
3 голосов
/ 01 августа 2020

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

Ошибка при попытке загрузить актив: FormatException: недопустимый символ схемы (на символе 6) Image (image:% 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;
    });
  }

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

Ответы [ 2 ]

0 голосов
/ 10 августа 2020

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

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

 }

Кроме того,

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

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

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

image = await FlutterWebImagePicker.getImage;
await image.toByteData();//This method has some parameters. Look into them
0 голосов
/ 04 августа 2020

Я тестировал этот пакет и был очень доволен результатом 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);
      });
    }
...