🔼
PlatformException(invalid_image, Cannot load representation of type
iOSで画像のアップロードに失敗する
昨晩まで、プログラムが動いていたのに、image_pickerの動作が急におかしくなった?
パッケージのバージョンが原因なのかは不明です?
Github issue
解決した方法。
こちらのUint8List classなるものを使用しました。そうすると画像のアップロードに成功しました?
ファイルの内容全体をバイトのリストとして読み込む。
ファイルの内容であるバイトのリストで完結するFuture<Uint8List>を返します。
8ビットの符号なし整数からなる固定長のリスト。
長いリストの場合、この実装はデフォルトのListの実装よりもかなりスペースと時間を節約することができます。
リストに格納された整数は,下位8ビットまで切り詰められ,0から255の範囲の値を持つ符号なし8ビット整数として解釈される。
クラスがUint8Listを拡張または実装しようとすると、コンパイル時にエラーとなる。
putFile以外に、putDataでもファイルのアップロードができるそうです。
修正したコード
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