Day#27 上传照片

前言

昨天因为对话的部分有bug...解不粗乃
呜呜呜想说那来先看看别的部分好了(?)

download library

一样,我们从firebase原先开好的专案进入storage,确认可以被连线後,在本地podfile把library load进来。

podfile

pod 'Firebase/Storage'

接着在终端机执行下载

pod install

上传

原理

基本上,上传档案/照片不外乎就是在上传的时候将档案转换成byte形式上传,然後储存在firebase storage空间中,当然,以各档案类型、原本的形式。

如果使用第三方的登入,那麽做法就会被拆解成:先下载第三方的头像 -> 上传该图片 -> 显示。
不过这次注册登入没有接第三方的api,所以就先这样~XD

资料结构

我们希望档案储存的结构如下,其中加上路径(子资料夹)images使得标的更清晰。
/images/a8udej-gmail-com_profile_picture.jpg

StorageManager

接着在resource的部分开新档案,我们使用一般的swift档案即可,就命名为StorageManager,顾名思义负责与储存空间相关的逻辑处理。

import FirebaseStorage

跟Database一样,我们使用static只让连线使用同一个

final class StorageManager {
    
    static let shared = StorageManager()
    
    private let storage = Storage.storage().reference()
    

然後我们开始开发uploadProfilePicture,其中completion我们希望可以用一个result去把回传的url包起来,因此可以另外写一个typealias

    // result is String either Error
    public typealias UploadPictureCompletion = (Result<String, Error>) -> Void
    

在这个方法中有两个error预期被handle,一个是当无法将图片正常上传、第二个是url没办法正确的回传。如果这两个没发生,预期是正常的结果,completion完成!

    /// Upload picture to firebase storage and return completion with url string to download
    public func uploadProfilePicture(with data: Data, fileName: String, completion: @escaping UploadPictureCompletion) {
        storage.child("imagess/\(fileName)").putData(data, metadata: nil, completion: {
            metadata, error in
            guard error == nil else {
                print("failed to upload data to firebase for pictures")
                completion(.failure(StorageErrors.failedToUpload))
                return
            }
            
            let reference = self.storage.child("imagess/\(fileName)").downloadURL(completion: { url, error in
                guard let url = url else {
                    print("")
                    completion(.failure(StorageErrors.failedToGetDownloadUrl))
                    return
                }
                
                let urlString = url.absoluteString
                print("download url returned: \(urlString)")
                completion(.success(urlString))
            })
        })
    }

其中,我们也把error讯息分别以enum的方式specify出来。

    public enum StorageErrors : Error {
        case failedToUpload
        case failedToGetDownloadUrl
    }
}

结语

那今天就先到这边~

若上述内容有误或可以改进的部分,欢迎留言以及提出任何指教~
谢谢 ヘ| ´ω` |ノ


<<:  用React刻自己的投资Dashboard Day27 - 台股技术面刻板

>>:  Day 27: 暴力破解 WPA/WPA2 加密 wifi 密码

从 IT 技术面细说 Search Console 的 27 组数字 KPI (3) 点击 (2) 网页搜寻

上一篇提到可以从 Search Console 看到 6 种不同的流量来源,而 SC 提供的概要是用...

解决 IIS 的 PHP 发生 FastCGI 处理序超过设定的活动逾时问题

今天在执行 WordPress 上的版本更新时,因为更新档案太大,出现了错误「FastCGI 处理序...

[Day 13] 实作 API Authentication

Ktor Authentication Plugin 因为 Ktor 的开发风格是 DSL,不依赖 ...

2021 WordPress虚拟主机推荐-从SiteGround搬到CLOUDWAYS

想记录一下搬家到Cloudways的心路历程以及经验分享... 老实说,我非常庆幸自己没有经历过Su...

Vue.js 从零开始 mitt

还记得区域元件有自己的作用域吗?已知外层元件可以跟内层元件传递资料(props),或是传递事件(em...