Alamofire 4 - 使用 gzip 编码上传多部分

Posted

技术标签:

【中文标题】Alamofire 4 - 使用 gzip 编码上传多部分【英文标题】:Alamofire 4 - upload multipart with gzip encoding 【发布时间】:2019-04-11 10:02:41 【问题描述】:

我有一个工作项目,它使用 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)
                
        )

【问题讨论】:

【参考方案1】:

如果您需要进行 gzip 编码等后期处理,您将无法使用内置的 upload(multipartFormData:...) 方法。相反,您需要单独使用 Alamofire 的多部分编码,生成数据,压缩它,然后使用 Alamofire 上传。

此外,您无需手动解压缩响应。只要适当的Content-Encoding 标头返回表明它已被gzip 压缩,它就会自动为您解压缩。

最后,您可以使用Data("string".utf8) 更轻松地从Strings 创建Data 值。

【讨论】:

非常感谢。我之前分别拆分并 gzip 压缩了数据,但不确定我是否仍然可以使用上传方法并利用 uploadProgress

以上是关于Alamofire 4 - 使用 gzip 编码上传多部分的主要内容,如果未能解决你的问题,请参考以下文章

AlamoFire 4.X 中的 URL 编码

Swift 4 Alamofire 和编码 UIImage 的问题

在 Swift 3 中从 URLSession 迁移到 Alamofire 4.3,编码问题

Alamofire 自定义参数编码

Alamofire .POST 编码 (.URL)

在 Alamofire 中使用之前对 URL 进行编码