利用環境
pubspec.yaml
firebase_auth: ^4.2.2
firebase_auth_web: ^5.2.10
firebase_core_web: ^2.2.2
firebase_core: ^2.10.0
image_picker: ^0.8.7+4
firebase_storage: ^11.1.1
実現したかったこと
- flutter経由でFirebaseのCloud Storageにスマホの写真フォルダにある写真をアップロードして、アプリ画面に映し出せるようにしたかった。
- Cloud Storageにアップロードされた写真のurlを取得する
起こった問題
- 現在(2023年10月時点)の公式ドキュメント通りやったがうまくいかなかった
解決法
・メタデータ(ファイルのパス?)も一緒にアップロードしたら解決した。
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:image_picker/image_picker.dart';
//一部省略しています
//写真をアップロードするメソッド
void _uploadPhoto() async {
UploadTask uploadTask;
final uid = FirebaseAuth.instance.currentUser?.uid; //uid取得
ImagePicker imagePicker = ImagePicker(); //写真フォルダを開く
XFile? file = await imagePicker.pickImage(source: ImageSource.gallery);
if (file == null) return;
Reference referenceRoot = FirebaseStorage.instance.ref("images/$uid").child(file.name); //cloud storageの/imagesフォルダにアップロード
final metadata = SettableMetadata(
contentType: 'image/jpeg',
customMetadata: {'picked-file-path': file.path});
if (kIsWeb) {
uploadTask = referenceRoot.putData(await file.readAsBytes(), metadata);
} else {
uploadTask = referenceRoot.putFile(io.File(file.path), metadata);
}
print('アップロード完了');
downloadUrl = await referenceRoot.getDownloadURL(); //url取得
print('downloadUrl:$downloadUrl');
}