Swift Perfect - 七牛上傳文件

image.png

引言

Perfect 是一個(gè)完整和強(qiáng)大的工具箱,框架和應(yīng)用程序服務(wù)器為L(zhǎng)inux,iOS和MacOS(OS X)。它提供了Swift工程師為開(kāi)發(fā)面向客戶(hù)端和服務(wù)器端應(yīng)用程序的Swift編程語(yǔ)言開(kāi)發(fā)輕量級(jí),可維護(hù),可擴(kuò)展的應(yīng)用程序和其他REST服務(wù)所需的一切。
接下來(lái)幾篇我對(duì) Perfect 框架進(jìn)行記錄。感興趣的可以看:
Swift Perfect - Ubuntu 服務(wù)器部署
Swift Perfect - 七牛上傳文件
Swift Perfect - iOS消息推送(APNs)之獲取 APNs 授權(quán)碼
Swift Perfect - 使用 systemd 命令服務(wù)器項(xiàng)目后臺(tái)運(yùn)行
Ubuntu 環(huán)境下 Nginx 的安裝部署
Swift Perfect - Nginx 配置 HTTPS 服務(wù)器

Perfect 七牛上傳文件庫(kù)

如果有能幫助到大家的地方,希望能點(diǎn)個(gè)贊,順便給GitHub上點(diǎn)個(gè)贊
我自己簡(jiǎn)單封裝成 Swift Package 庫(kù) (需要Swift 4.2 環(huán)境)
https://github.com/LeeCenY/Perfect-Qiniu

依賴(lài)庫(kù):

    .package(url: "https://github.com/PerfectlySoft/Perfect-CURL.git", from: "3.0.6"),
    .package(url: "https://github.com/PerfectlySoft/Perfect-Crypto.git", from: "3.1.2") 

安裝:

    .package(url: "https://github.com/LeeCenY/Perfect-Qiniu.git", from: "1.0.4") 

使用:


     let config = QiniuConfiguration(accessKey: AccessKey, secretKey: SecretKey, scope: scope, fixedZone: .HNzone, DEBUG: false)
     _ = try Qiniu.upload(fileName: zipName, file: thisZipFile, config: config)

異常處理:

     public enum UploadError: Error {
          case badToken
          case RequestfFailed(String)
      }

直傳文件
https://developer.qiniu.com/kodo/api/1312/upload

上傳地址
https://developer.qiniu.com/kodo/manual/1671/region-endpoint

請(qǐng)求元素
upload_token : 上傳憑證
fileName : UUID - 房間號(hào) - 年月日
fileBinaryData : 圖片 data 格式

上傳憑證


scope = 'my-rent:502-201804.jpg'   # my-rent 空間名稱(chēng)  502-201804圖片名稱(chēng)
deadline = 1451491200 # 授權(quán)有效期截止到 2015-12-31 00:00:00(該有效期指上傳完成后在七牛生成文件的時(shí)間,而非上傳的開(kāi)始時(shí)間)
#圖片的名稱(chēng)、大小、寬高和校驗(yàn)值
returnBody = '{
      "name": "\(fname)",  
      "size": "\(fsize)",      
      "w": "\(imageInfo.width)",   
      "h": "\(imageInfo.height)",
      "hash": "\(etag)"  
}

    1. 將上傳策略序列化成為JSON

putPolicy = 
'{
  "scope": "my-bucket:sunflower.jpg",
  "deadline":1451491200,
  "returnBody":
  "{
    \"name\":$(fname),
    \"size\":$(fsize),
    \"w\":$(imageInfo.width),
    \"h\":$(imageInfo.height),
    \"hash\":$(etag)
   }"
}'


encodedPutPolicy = urlsafe_base64_encode(putPolicy)
#實(shí)際值為:
encodedPutPolicy = "eyJzY29wZSI6Im15LWJ1Y2tldDpzdW5mbG93ZXIuanBnIiwiZGVhZGxpbmUiOjE0NTE0OTEyMDAsInJldHVybkJvZHkiOiJ7XCJuYW1lXCI6JChmbmFtZSksXCJzaXplXCI6JChmc2l6ZSksXCJ3XCI6JChpbWFnZUluZm8ud2lkdGgpLFwiaFwiOiQoaW1hZ2VJbmZvLmhlaWdodCksXCJoYXNoXCI6JChldGFnKX0ifQ=="


sign = hmac_sha1(encodedPutPolicy, "<SecretKey>")
#假設(shè) SecretKey 為 MY_SECRET_KEY,實(shí)際簽名為:
sign = "c10e287f2b1e7f547b20a9ebce2aada26ab20ef2"


encodedSign = urlsafe_base64_encode(sign)
#最終簽名值為:
encodedSign = "wQ4ofysef1R7IKnrziqtomqyDvI="


uploadToken = AccessKey + ':' + encodedSign + ':' + encodedPutPolicy
#假設(shè)用戶(hù)的 AccessKey 為 MY_ACCESS_KEY ,則最后得到的上傳憑證應(yīng)為:
uploadToken = "MY_ACCESS_KEY:wQ4ofysef1R7IKnrziqtomqyDvI=:eyJzY29wZSI6Im15LWJ1Y2tldDpzdW5mbG93ZXIuanBnIiwiZGVhZGxpbmUiOjE0NTE0OTEyMDAsInJldHVybkJvZHkiOiJ7XCJuYW1lXCI6JChmbmFtZSksXCJzaXplXCI6JChmc2l6ZSksXCJ3XCI6JChpbWFnZUluZm8ud2lkdGgpLFwiaFwiOiQoaW1hZ2VJbmZvLmhlaWdodCksXCJoYXNoXCI6JChldGFnKX0ifQ=="

        let fields = CURL.POSTFields()
        let _ = fields.append(key: "token", value: token)
        let _ = fields.append(key: "key", value: "測(cè)試")
        let _ = fields.append(key: "file", path: file)
        
        let curl = CURL(url: "https://up-z2.qiniup.com/")
        let ret = curl.formAddPost(fields: fields)
        defer { curl.close() }
        guard ret.rawValue == 0 else {
            throw Exception.INVALID_URL(curl.strError(code: ret))
        }
        let _ = curl.setOption(CURLOPT_VERBOSE, int: self.DEBUG ? 1 : 0 )
        let r = curl.performFullySync()
    
        var ptr = r.bodyBytes
        ptr.append(0)
        let s = String(cString: ptr)
        guard r.resultCode == 0, r.responseCode == 200 else {
            throw Exception.INVALID_URL(s)
        }
        return try s.jsonDecode() as? [String:Any] ?? [:]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容