首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift2从Firebase检索图像

Swift2从Firebase检索图像
EN

Stack Overflow用户
提问于 2015-11-11 05:03:01
回答 2查看 4.5K关注 0票数 4

我正在尝试从Firebase读取/显示图像。我首先对图像进行编码,然后将这个编码的字符串发送到Firebase。这个没问题。当我尝试从Firebase解码编码的字符串并将其转换为图像时,我将得到一个零值异常。

我就是这样把图像保存到Firebase的

代码语言:javascript
复制
var base64String: NSString!
func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {

    self.dismissViewControllerAnimated(true, completion: nil)

    imageToPost.image = image

    var uploadImage = image as! UIImage
    var imageData = UIImagePNGRepresentation(uploadImage)!
    self.base64String = imageData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength)
    let ref = Firebase(url: "https://XXX.firebaseio.com")

    var quoteString = ["string": self.base64String]
    var usersRef = ref.childByAppendingPath("goalImages")
    var users = ["image": quoteString]
    usersRef.setValue(users)

    displayAlert("Image Posted", message: "Your image has been successfully posted!")
}

这就是我试图从Firebase读取图像的方式

代码语言:javascript
复制
//  ViewController.swift

import UIKit
import Firebase

class ViewController: UIViewController {
@IBOutlet weak var image: UIImageView!
var base64String: NSString!

@IBAction func buttonClicked(sender: AnyObject) {

    sender.setTitle("\(sender.tag)", forState: UIControlState.Normal)

}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    let ref = Firebase(url: "https://XXX.firebaseio.com/goalImages/image/string")

    ref.observeEventType(.Value, withBlock: { snapshot in

        self.base64String = snapshot.value as! NSString
        let decodedData = NSData(base64EncodedString: self.base64String as String, options: NSDataBase64DecodingOptions())
        //Next line is giving the error
        var decodedImage = UIImage(data: decodedData!)

        self.image.image = decodedImage
        }, withCancelBlock: { error in
            print(error.description)
        })

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
}

错误是:“致命错误:在展开可选值时意外地发现为零”;decodedData为零。有人能解释一下到底是怎么回事吗。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-02 13:51:48

而不是

代码语言:javascript
复制
let decodedData = NSData(base64EncodedString: self.base64String as String, 
                                     options: NSDataBase64DecodingOptions())

尝试添加IgnoreUnknownCharacters

代码语言:javascript
复制
NSDataBase64DecodingOptions.IgnoreUnknownCharacters

使用示例:编码jpg,存储并从防火墙读取

编码并写出我们最喜欢的星际飞船

代码语言:javascript
复制
    if let image = NSImage(named:"Enterprise.jpeg") {
    let imageData = image.TIFFRepresentation
    let base64String = imageData!.base64EncodedStringWithOptions(.Encoding64CharacterLineLength)
    let imageRef = myRootRef.childByAppendingPath("image_path")
    imageRef.setValue(base64String)

读取和解码

代码语言:javascript
复制
       imageRef.observeEventType(.Value, withBlock: { snapshot in

            let base64EncodedString = snapshot.value
            let imageData = NSData(base64EncodedString: base64EncodedString as! String, 
                           options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters)
            let decodedImage = NSImage(data:imageData!)
            self.myImageView.image = decodedImage

            }, withCancelBlock: { error in
                print(error.description)
        })

编辑2019_05_17

更新到Swift 5和Firebase 6

代码语言:javascript
复制
func writeImage() {
    if let image = NSImage(named:"Enterprise.jpg") {
        let imageData = image.tiffRepresentation
        if let base64String = imageData?.base64EncodedString() {
            let imageRef = self.ref.child("image_path")
            imageRef.setValue(base64String)
        }
    }
}

func readImage() {
    let imageRef = self.ref.child("image_path")
    imageRef.observeSingleEvent(of: .value, with: { snapshot in
        let base64EncodedString = snapshot.value as! String
        let imageData = Data(base64Encoded: base64EncodedString, options: Data.Base64DecodingOptions.ignoreUnknownCharacters)!
        let decodedImage = NSImage(data: imageData)
        self.myImageView.image = decodedImage
    })
}
票数 6
EN

Stack Overflow用户

发布于 2016-05-22 16:50:28

这里的消防工程师:

我强烈建议使用新的火源储存 API将图像上传到Firebase。它使用简单,成本低,并得到谷歌云存储的大规模支持。

您可以从NSData或指向本地文件的NSURL上传(我将显示NSData,但原则是相同的):

代码语言:javascript
复制
// Data in memory
let data: NSData = ...

// Create a reference to the file you want to upload
let riversRef = storageRef.child("images/rivers.jpg")

// Upload the file to the path "images/rivers.jpg"
let uploadTask = riversRef.putData(data, metadata: nil) { metadata, error in
  if (error != nil) {
    // Uh-oh, an error occurred!
  } else {
    // Metadata contains file metadata such as size, content-type, and download URL.
    let downloadURL = metadata!.downloadURL
    // This can be stored in the Firebase Realtime Database
    // It can also be used by image loading libraries like SDWebImage
  }
}

您甚至可以暂停并继续上传,并且可以轻松地监视上传的进度:

代码语言:javascript
复制
// Upload data
let uploadTask = storageRef.putData(...)

// Add a progress observer to an upload task
uploadTask.observeStatus(.Progress) { snapshot in
  // Upload reported progress
  if let progress = snapshot.progress {
    let percentComplete = 100.0 * Double(progress.completedUnitCount) / Double(progress.totalUnitCount)
  }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33644560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档