簡體   English   中英

Alamofire 4-使用gzip編碼上傳多部分

[英]Alamofire 4 - upload multipart with gzip encoding

我有一個正在運行的項目,該項目使用Alamofire處理所有請求,包括帶有分段數據的上傳。 目前,此方法工作正常,但是我們希望轉而使用GZIP處理所有請求和響應。 我正在使用gzip swift庫,現在可以通過請求接收gzip壓縮的數據,但是我不知道如何對導致調用失敗的多部分數據進行gzip編碼。

我一直在尋找解決方案,盡管我遇到了一篇有關該解決方案的文章,但提供的示例僅適用於較早的Alamofire和Swift版本。 我嘗試破解它以使其正常工作,但是有一些我無法解決的錯誤。

我的請求代碼如下:

            self.sessionManager.upload(
            multipartFormData: { multipartFormData in
                multipartFormData.append("\(sUUID)".data(using: String.Encoding.utf8)!, withName: "sUUID")
                multipartFormData.append(sStream, withName: "files[]", fileName: fileName, mimeType: "image/\(sExt)")
                multipartFormData.append("\(convertedEventID)".data(using: String.Encoding.utf8)!, withName: "nEventID")
                multipartFormData.append("\(sExt)".data(using: String.Encoding.utf8)!, withName: "sExt")
                multipartFormData.append("0".data(using: String.Encoding.utf8)!, withName: "bRecurring")
                multipartFormData.append("\(fileName)".data(using: String.Encoding.utf8)!, withName: "sDescription")
                multipartFormData.append("File Attached By User".data(using: String.Encoding.utf8)!, withName: "sWordDocumentType")
                multipartFormData.append("".data(using: String.Encoding.utf8)!, withName: "sWordDocumentName")
                multipartFormData.append("".data(using: String.Encoding.utf8)!, withName: "sSname")
                multipartFormData.append("".data(using: String.Encoding.utf8)!, withName: "sEmailRecip")
                multipartFormData.append("".data(using: String.Encoding.utf8)!, withName: "sEmailSender")
                multipartFormData.append("".data(using: String.Encoding.utf8)!, withName: "sNotes")
                multipartFormData.append("ME".data(using: String.Encoding.utf8)!, withName: "sAgent")
        },
            to: "/Upload",
            encodingCompletion: { encodingResult in
                switch encodingResult {
                case .success(let upload, _, _):
                    upload.responseString { response in
                        let decompressedData: Data
                        if response.data!.isGzipped {
                            decompressedData = try! response.data!.gunzipped()
                        } else {
                            decompressedData = response.data!
                        }
                        NotificationCenter.default.post(name: .didReceiveData, object: self, userInfo: ["pass" : 1])
                        completion(true, 200, decompressedData, nil)
                    }
                    upload.uploadProgress { progress in
                        print(progress.fractionCompleted)
                    }
                case .failure(let encodingError):
                    print(encodingError)
                    completion(false, 404, nil, encodingError)
                }
        })

如果您需要進行gzip編碼之類的后期處理,則將無法使用內置的upload(multipartFormData:...)方法。 相反,您需要分別使用Alamofire的多部分編碼,生成數據,將其壓縮,然后使用Alamofire上載。

另外,您無需手動解壓縮響應。 只要返回適當的Content-Encoding標頭,表明已將其壓縮,就應該為您自動將其解壓縮。

最后,您可以使用Data("string".utf8)String輕松創建Data值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM