🔼

PlatformException(invalid_image, Cannot load representation of type

2023/04/06に公開

iOSで画像のアップロードに失敗する

昨晩まで、プログラムが動いていたのに、image_pickerの動作が急におかしくなった?

パッケージのバージョンが原因なのかは不明です?
Github issue
https://github.com/flutter/flutter/issues/82602

解決した方法。
こちらのUint8List classなるものを使用しました。そうすると画像のアップロードに成功しました?
https://api.flutter.dev/flutter/dart-io/File/readAsBytes.html
ファイルの内容全体をバイトのリストとして読み込む。


ファイルの内容であるバイトのリストで完結するFuture<Uint8List>を返します。
https://api.flutter.dev/flutter/dart-typed_data/Uint8List-class.html
Uint8List クラス Null の安全性
8ビットの符号なし整数からなる固定長のリスト。

長いリストの場合、この実装はデフォルトのListの実装よりもかなりスペースと時間を節約することができます。

リストに格納された整数は,下位8ビットまで切り詰められ,0から255の範囲の値を持つ符号なし8ビット整数として解釈される。

クラスがUint8Listを拡張または実装しようとすると、コンパイル時にエラーとなる。


putFile以外に、putDataでもファイルのアップロードができるそうです。 
https://firebase.google.com/docs/storage/flutter/upload-files?hl=ja

修正したコード

Future<void> fileUpload(BuildContext context) async {
    // imagePickerで画像を選択する
    final pickerFile =
        await ImagePicker().pickImage(source: ImageSource.gallery);
    if (pickerFile == null) {
      return;
    }
    File file = File(pickerFile.path);
    try {
      // imagesフォルダを指定してuidと画像を保存.
      final uid = auth.currentUser?.uid ?? '';
      final uploadName = "image.png";
      final snapshot = await storageRef.ref().child("images/$uid/$uploadName");
      // 画像をStorageにuploadする処理.
      // final task = await snapshot.putFile(file);
      // putData(await file.readAsBytes());に変更すると解消できた?
      final task = await snapshot.putData(await file.readAsBytes());
      final imageUrl = await snapshot.storage
          .ref()
          .child("images/$uid/$uploadName")
          .getDownloadURL();
      // uploadに成功するとlogが表示される.
      print(imageUrl);
    } catch (e) {
      showDialog(
        context: context,
        barrierDismissible: false,
        builder: (BuildContext dialogContext) {
          return AlertDialog(
            title: const Text('画像のアップロードに失敗しました!'),
            actions: <Widget>[
              TextButton(
                child: const Text('OK'),
                onPressed: () {
                  Navigator.pop(dialogContext);
                },
              ),
            ],
          );
        },
      );
    }
  }


Discussion