firebaseに画像をアップロードしようとするとエラーが出る
開発環境
- Flutter
- firebase storage
エラー内容
[firebase_storage/unknown] The operation couldn’t be completed. Message too long.
メッセージが長すぎると言われる
調べてみたところ、稀にiosでも同様のエラーが発生する場合があるらしい
試したこと
- 画像圧縮
- ファイル名短縮
- putFile → putDataに変更【💡解決!】
1. 画像圧縮✖
画像を幅600pxまで落とし、解像度を80%にしたが効果は無かった。
2. ファイル名短縮✖
もともと時間取得する関数で13桁の整数をファイル名にしていたが、それを6文字にしてみたが効果なし。
3. putFile → putDataに変更〇
putFileで送信していところをputDataで送るようにしたら画像をアップロードできるようになった!
putDataに置き換えるに伴って送信する画像の型など変換の必要があった。
解決方法
以下のコードでputDataとして送信
FirebaseStorage.instance.ref("image/sample").putData(uint8list, metadata)
なぜputDataだといけたのか
firebaeドキュメント
putDataとputFileの違い
putData ... メモリ内のデータからアップロードする
putFile ... デバイス上のファイルを表す URL (ローカルファイル)からアップロードする
文字列や File のアップロードが現実的でない場合は、下位の型付きデータを Uint8List 形式でアップロードできます。この場合は、データを指定して putData() メソッドを呼び出します。
ほえー
Fileがでかすぎたり何かしらの要因でアップロードできない場合は、Uint8List
形式に変換してputData()
で送信することでアップロードできるらしい。
Uint8Listについて
Uint8List
...Dart型の1つで、固定長の8ビット符号なし整数のリスト
この辺が分かりやすかったです
画像ファイルをputDataでアップロードすることの弊害
- putDataメソッドで保存しているので、putFileとは保存されるデータの形式が異なる。
- firebase storageで画像が表示されない。画像を確認したい場合、URLからダウンロードして見る必要がある
最後に
このエラー自体あまり頻繁に起こることではなさそうですが、もし同じ状況になった際参考になれば良いと思います