
Firebaseに画像を保存する場合、Storageというところに保存することになります。
例えばユーザーのプロフィール画像や投稿された画像を保存する際などに使われることが多いです。
Storageへ画像を保存
私が画像をStorageに保存した時のコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
func uploadImage () { //ストレージサーバのURLを取得 let storage = Storage.storage().reference(forURL: "あなた固有のURL") // パス: あなた固有のURL/profileImage/{user.uid}.jpeg let imageRef = storage.child("profileImage").child("\(user.uid).jpeg") //保存したい画像のデータを変数として持つ var ProfileImageData: Data = Data() //プロフィール画像が存在すれば if profileImageView.image != nil { //画像を圧縮 ProfileImageData = (profileImageView.image?.jpegData(compressionQuality: 0.01))! } //storageに画像を送信 imageRef.putData(ProfileImageData, metadata: nil) { (metaData, error) in //エラーであれば if error != nil { print(error.debugDescription) return //これより下にはいかないreturn } } } |
ちょっと長いですが一つずつ説明していきます。
fa-chevron-circle-rightストレージサーバのURLを取得
let storage = Storage.storage().reference(forURL: "あなた固有のURL")
これを取得しないと保存ができない(はず)なので、取得しましょう。
やり方はまず、自身のプロジェクトのfirebaseのコンソール画面のStorageタブを開きます。
画像の中央に〜.appspot.comというURLがあります。これを""で包んで該当箇所に記述しましょう。
fa-chevron-circle-rightパスを指定する変数を定義
let imageRef = storage.child("profileImage").child("\(user.uid).jpeg")
画像のありか(ストレージの場所)を示すパス(あなた固有のURL/フォルダの名前/{user.uid}.jpeg)を指定する変数を定義しています。
"profileImage"
はフォルダの名前です。これは自分で好きな名前をつけてください。上のコンソール画面の画像でもprofileImageというフォルダが作られているのが確認できます。
"\(user.uid).jpeg"
は画像の「.jpeg」以前にAuthの.uidを入れるようにしています。
ここも自分の好きなように応用してください。
コンソール画面のフォルダをクリックすると、保存した画像が一覧で見れます。
ここの「.jpeg」以前の部分が私の場合は.uidになるということです。
fa-chevron-circle-right保存したい画像のデータを変数として持つ
var ProfileImageData: Data = Data()
のちに画像を圧縮したりstorageに画像を送信する際にはData型である必要がある(多分)のでここでそれ用の変数を定義しておきます。
私の場合はユーザーのプロフィール画像を保存したかったのでvar ProfileImageData
としましたが、ここも皆さんの好きにして良いです。
fa-chevron-circle-right画像を圧縮
ProfileImageData = (profileImageView.image?.jpegData(compressionQuality: 0.01))!
画像のサイズが大きすぎるとアプリの挙動が遅くなったりすることがあるので圧縮(リサイズ)してから画像を保存しましょう。
compressionQuality: 0.01
ここの数字でどれくらいのサイスにするか指定できます。
fa-chevron-circle-rightstorageに画像を送信
imageRef.putData(ProfileImageData, metadata: nil) { (metaData, error) in }
imageRef
で画像の保存先のパスを指定し、保存したい画像のデータが入ったProfileImageData
をstorageに送信することで画像が保存できます。保存が成功すればmetaData
、失敗すればerror
に値が入ります。
Storageの画像を取得
1 2 3 4 5 |
if let user = Auth.auth().currentUser { let storageref1 = Storage.storage().reference(forURL: "gs://ogiri-d1811.appspot.com").child("profileImage").child("\(user.uid).jpeg") profileImageView.sd_setImage(with: storageref1) } |
これはFirebaseUIを使ったやり方です。podファイルに「pod 'FirebaseUI/Storage'」を追加する必要があります。
if let user = Auth.auth().currentUser {
let storageref1 = Storage.storage().reference(forURL: "gs://ogiri-d1811.appspot.com").child("profileImage").child("\(user.uid).jpeg")
}
ここでstorageref1
に取得したい画像のパスを入れます。
私の場合は「Authのuid.jpeg」になるようになっているので.child("\(user.uid).jpeg")
になっています。
profileImageView.sd_setImage(with: storageref1)
あとはImageViewに.sd_setImage(with:取得したい画像のパス)で画像の取得はOKです。