Firebase에서 제공하는 저장공간 (데이터 클라우드)
이미지, 파일, 동영상 등 멀티미디어나 바이너리를 저장하여 사용할 수 있음
업로드하고, 다운로드 URL을 사용하는 방식
reference라는 ‘참조’ 방식인데, 폴더 경로를 생각할 수 있음
final storageRef = FirebaseStorage.instance.ref();
콘솔에서 storage 사용 설정
final storageRef = FirebaseStorage.instance.ref('images/mountains.jpg');
await storageRef.putData(data);
final storageRef = FirebaseStorage.instance.ref('images/myImage.jpg');
var fileUrl = await storageRef.getDownloadUrl();
import 'dart:io';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:get/get.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:image_picker/image_picker.dart';
import '../model/profile.dart';
import 'auth_controller.dart';
class MainController extends GetxController {
final RxList images = [].obs;
User? get user => Get.find<AuthController>().user.value;
Profile? get profile => Get.find<AuthController>().profile.value;
fetchImages() async {
var ref = FirebaseStorage.instance.ref('/images');
var res = await ref.listAll();
images.clear();
for (var item in res.items) {
var url = await item.getDownloadURL();
images.add(url);
}
}
uploadImage(XFile file) {
var ref = FirebaseStorage.instance.ref('/images/${file.name}.png');
ref.putFile(File(file.path)).then((p0) {
fetchImages();
});
}
}
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:image_picker/image_picker.dart';
import '../controller/auth_controller.dart';
import '../controller/main_controller.dart';
class MainPage extends GetView<MainController> {
const MainPage({Key? key}) : super(key: key);
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Obx(() => SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Row(
children: [
CircleAvatar(
radius: 36,
backgroundImage: controller.user!.photoURL != null
? NetworkImage(controller.user!.photoURL!)
: null,
),
Expanded(
child: Card(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Text('혈액형: ${controller.profile?.bloodtype ?? 'null'}'),
Text('직업: ${controller.profile?.job ?? 'null'}'),
Text('mbti: ${controller.profile?.mbti ?? 'null'}'),
],
),
),
),
],
),
...controller.images.map((e) => Image.network(e)).toList(),
TextButton(
onPressed: () async {
var picker = ImagePicker();
var res = await picker.pickImage(source: ImageSource.gallery);
if (res != null) {
controller.uploadImage(res);
}
},
child: Text('업로드')
)
],
),
)),
),
floatingActionButton: FloatingActionButton(
onPressed: () => Get.toNamed('edit/profile'),
child: Icon(Icons.edit),
),
);
}
}
handleOnTap() async {
var picker = ImagePicker();
var res = await picker.pickImage(source: ImageSource.gallery);
if (res != null) {
// 스토리지 올리기
var ref = FirebaseStorage.instance.ref('profile/${user!.uid}');
await ref.putFile(File(res.path));
var downloadUrl = await ref.getDownloadURL();
print(downloadUrl);
// downloadUrl 받기
user!.updatePhotoURL(downloadUrl);
}
}
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:image_picker/image_picker.dart';
import '../controller/auth_controller.dart';
import '../controller/main_controller.dart';
class MainPage extends GetView<MainController> {
const MainPage({Key? key}) : super(key: key);
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Obx(() => SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
GestureDetector(
child: Container(
width: 150,
height: 150,
child: CircleAvatar(
radius: 36,
backgroundImage: controller.user!.photoURL != null
? NetworkImage(controller.user!.photoURL!)
: null,
),
),
onTap: controller.handleOnTap,
),
SizedBox(height: 16),
Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(controller.user!.displayName!),
Text(controller.user!.email!),
],
),
],
),
)),
),
);
}
}