Firebase Databaseに画像のダウンロードURLを入れたいです。画像をストレージにアップロードできますが、残りの「投稿」でデータベースにURLを取得する方法がわかりません。
@IBOutlet weak var titleText: UITextField!
@IBOutlet weak var authorText: UITextField!
@IBOutlet weak var mainText: UITextView!
@IBOutlet weak var dateText: UITextField!
@IBOutlet weak var myImageView: UIImageView!
var ref:FIRDatabaseReference?
override func viewDidLoad() {
super.viewDidLoad()
ref = FIRDatabase.database().reference()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
@IBAction func uploadImage(_ sender: Any) {
let image = UIImagePickerController()
image.delegate = self
image.sourceType = UIImagePickerControllerSourceType.photoLibrary
image.allowsEditing = false
self.present(image, animated: true)
{
//after its completed
}
}
@objc(imagePickerController:didFinishPickingMediaWithInfo:) func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
{
if let image = info[UIImagePickerControllerOriginalImage] as? UIImage
{
myImageView.image = image
}
else
{
//error
}
self.dismiss(animated: true, completion: nil)
let storageRef = FIRStorage.storage().reference().child("myImage.png")
if let uploadData = UIImagePNGRepresentation(self.myImageView.image!){
storageRef.put(uploadData, metadata: nil, completion:
{
(metadata, error) in
if error != nil {
print("error")
return
}
print(metadata)
//how do I put the download URL in the metadata into my database
}
)
}
}
@IBAction func addPost(_ sender: Any) {
if self.titleText.text != "" && self.authorText.text != "" && self.mainText.text != "" && self.dateText.text != ""
{
ref?.child("Posts").childByAutoId().setValue(["Title": titleText.text,"Article": mainText.text, "Author": authorText.text, "Date": dateText.text, "myImageURL": myImageURL])
//the myImageURL part is where I get an error
self.performSegue(withIdentifier: "post", sender: self)
}
else{
let alertController = UIAlertController(title: "Oops!", message: "Field left blank", preferredStyle: .alert)
let defaultAction = UIAlertAction(title: "Ok", style: .cancel, handler: nil)
alertController.addAction(defaultAction)
self.present(alertController, animated: true, completion: nil)
}
}
}
upload
およびsave
funcsを次のように整理します。
func uploadMedia(completion: @escaping (_ url: String?) -> Void) {
let storageRef = FIRStorage.storage().reference().child("myImage.png")
if let uploadData = UIImagePNGRepresentation(self.myImageView.image!) {
storageRef.put(uploadData, metadata: nil) { (metadata, error) in
if error != nil {
print("error")
completion(nil)
} else {
completion((metadata?.downloadURL()?.absoluteString)!))
// your uploaded photo url.
}
}
}
次に、FIRDatabase
に接続して、ノードに保存します。
@IBAction func addPost(_ sender: Any) {
if self.titleText.text != "" && self.authorText.text != ""
&& self.mainText.text != "" && self.dateText.text != "" {
uploadMedia() { url in
guard let url = url else { return }
ref?.child("Posts").childByAutoId().setValue([
"Title" : titleText.text,
"Article" : mainText.text,
"Author" : authorText.text,
"Date" : dateText.text,
"myImageURL" : url
])
}
}
my answer でデータをアップロードし、URLをデータベースに保存することもできます。
それが役に立てば幸い
更新されたFirebaseバージョンの場合Swift 4.2 Code:
func uploadMedia(completion: @escaping (_ url: String?) -> Void) {
let storageRef = Storage.storage().reference().child("\(Auth.auth().currentUser?.uid ?? "").png")
if let uploadData = self.imgUploadView.image?.jpegData(compressionQuality: 0.5) {
storageRef.putData(uploadData, metadata: nil) { (metadata, error) in
if error != nil {
print("error")
completion(nil)
} else {
storageRef.downloadURL(completion: { (url, error) in
print(url?.absoluteString)
completion(url?.absoluteString)
})
// completion((metadata?.downloadURL()?.absoluteString)!))
// your uploaded photo url.
}
}
}
}
遅すぎるかもしれませんが、 tilityクラスを使用して画像とファイルをFirebase Storageにアップロードする を使用することで、より簡単な方法を見つけました。上記のユーティリティクラスを使用して、1回のメソッド呼び出しで画像とファイルをアップロードできます。お気に入り
if let data = image.pngData() { // convert your UIImage into Data object using png representation
FirebaseStorageManager().uploadImageData(data: data, serverFileName: "your_server_file_name.png") { (isSuccess, url) in
print("uploadImageData: \(isSuccess), \(url)")
}
}
//MARK: - Upload image
func uploadImage(_ image: UIImage){
let imageName:String = String("\(CurrentTimeStampInSecond).png")
let storageRef = Storage.storage().reference().child("profilePic").child(imageName)
let compressImage = HelperFunction.helper.resizeImage(image: image)
if let uploadData = UIImagePNGRepresentation(compressImage){
storageRef.putData(uploadData, metadata: nil
, completion: { (metadata, error) in
if error != nil {
print("error")
self.stopAnimating()
showAlertWithTitleWithMessage(message: "Please try again later")
return
}else{
self.stopAnimating()
}
let strPic:String = (metadata?.downloadURL()?.absoluteString)!
print(metadata)
//self.imagePath = (metadata?.downloadURL()?.absoluteString)!
//self.sendMessageOnServer()
print("\n\n\n\n\n\n ===download url : \(strPic)")
})
}
}