菜鸟教程小白 发表于 2022-12-11 18:24:15

ios - 从 Firebase 上传和检索照片


                                            <p><p>我已经构建了应用程序,它显示在书籍的 UITableView 数据中。一切都很完美,我唯一需要的是这本书的照片。要上传和检索照片,我使用 Firebase,但我不知道如何处理照片。 </p>

<p>这是我已经实现的:</p>

<pre><code>@IBAction func ButtonScatta(_ sender: UIButton) {

    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera) {
      let imagePicker = UIImagePickerController()
      imagePicker.delegate = self
      imagePicker.sourceType = UIImagePickerControllerSourceType.camera;
      imagePicker.allowsEditing = false
      self.present(imagePicker, animated: true, completion: nil)
    }

}

@IBAction func ButtonScegli(_ sender: UIButton) {

    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary) {
      let imagePicker = UIImagePickerController()
      imagePicker.delegate = self
      imagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary;
      imagePicker.allowsEditing = true
      self.present(imagePicker, animated: true, completion: nil)
    }

}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: !) {
    ImageView.image = image
    self.dismiss(animated: true, completion: nil);
}
</code></pre>

<p>这就是“Vendi”按钮的功能:</p>

<pre><code>if let user = FIRAuth.auth()?.currentUser{

      self.emailUser.text = user.email
      let userID: String = user.uid
      let x = libriArray.count
      let y = String(x+1)
      //let imageLibro: UIImage = self.ImageView.image!
      let emailVenditore: String = self.emailUser.text!
      let titoloLibro: String = self.TitoloText.text!
      let codiceLibro: String = self.ISBNText.text!
      let prezzoLibro: String = self.PrezzoText.text!
      let edizioneLibro: String = self.EdizioneText.text!
      let statoLibro: Bool = false

      let Libro = [&#34;titolo&#34;: titoloLibro, &#34;codice&#34;: codiceLibro, &#34;prezzo&#34;: prezzoLibro, &#34;autore&#34;: edizioneLibro, &#34;emailUser&#34;: emailVenditore, &#34;userID&#34;: userID, &#34;stato&#34;: statoLibro] as

      let libriRef = ref.child(byAppendingPath: &#34;Libri&#34;)

      var libri =
      libriRef.childByAutoId().setValue(Libro)

      self.dismiss(animated: true, completion: nil)

    }else {

    }
</code></pre>

<p>有人可以写并解释如何上传和检索这些照片吗?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我很难用这些 var 名称准确跟踪您在做什么。但是,我假设您从 imagePickerController 获得了 <code>UIImage</code>。</p>

<p>您将需要 Firebase Storage (<code>pod 'Firebase/Storage'</code>) 和相应文件中的 <code>import FirebaseStorage</code>。</p>

<p>您可以执行以下操作将 <code>UIImage</code> 上传到 Firebase 存储:</p>

<pre><code>func uploadPhoto(_ image: UIImage, completionBlock: @escaping () -&gt; Void) {
    let ref = FIRStorage.storage().reference().child(&#34;myCustomPath&#34;).child(&#34;myFileName.jpg&#34;)    // you may want to use UUID().uuidString + &#34;.jpg&#34; instead of &#34;myFileName.jpg&#34; if you want to upload multiple files with unique names

    let meta = FIRStorageMetadata()
    meta.contentType = &#34;image/jpg&#34;

    // 0.8 here is the compression quality percentage
    ref.put(UIImageJPEGRepresentation(image, 0.8)!, metadata: meta, completion: { (imageMeta, error) in
      if error != nil {
            // handle the error
            return
      }

      // most likely required data
      let downloadURL = imageMeta?.downloadURL()?.absoluteString      // needed to later download the image
      let imagePath = imageMeta?.path   // needed if you want to be able to delete the image later

      // optional data
      let timeStamp = imageMeta?.timeCreated
      let size = imageMeta?.size

      // ----- should save these data in your database at this point -----

      completionBlock()
    })

}
</code></pre>

<p>这是一个简单的函数,可以将 <code>UIImage</code> 上传到 Firebase 存储。请注意,您应该跟踪 downloadURL 和您上传的每张图片的路径。您可以在任何上传后将它们保存在数据库中。</p>

<p>要下载您上传的图片,您可以执行以下操作:</p>

<pre><code>func retrieveImage(_ URL: String, completionBlock: @escaping (UIImage) -&gt; Void) {
    let ref = FIRStorage.storage().reference(forURL: URL)

    // max download size limit is 10Mb in this case
    ref.data(withMaxSize: 10 * 1024 * 1024, completion: { retrievedData, error in
      if error != nil {
            // handle the error
            return
      }

      let image = UIImage(data: retrievedData!)!

      completionBlock(image)

    })
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 从 Firebase 上传和检索照片,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/41313669/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/41313669/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 从 Firebase 上传和检索照片