无需 SDK 将文件上传到 Quickblox,最好使用 Alamofire

Posted

技术标签:

【中文标题】无需 SDK 将文件上传到 Quickblox,最好使用 Alamofire【英文标题】:Upload file to Quickblox without SDK, ideally with Alamofire 【发布时间】:2016-08-14 23:16:03 【问题描述】:

我正在尝试将一个 sqlite 文件从一个用 Swift 编写的 OS X 项目上传到 Quickblox 服务器。我已经在 ios 上使用 Quickblox iOS SDK 解决了这个问题:

                    let file = QBCOFile()
                    file.name = "ThisFileName"
                    file.contentType = "sqlite"
                    let theData = NSData(contentsOfFile: originalPath)
                    file.data = theData
                    QBRequest.uploadFile(file, className: "MyClassName", objectID: cusObjID, fileFieldName: "FieldName", successBlock: (response:QBResponse,fileUploadInfo:QBCOFileUploadInfo?) in

                        , statusBlock: nil, errorBlock: (response:QBResponse) in

                            showError()
                    )

在 OS X 中,我一直在使用 Alamofire 并收到了其他工作请求,但不是这个。他们的 API 页面 (https://quickblox.com/developers/Custom_Objects#Upload.2FUpdate_file) 上的请求描述是这样的:

curl -X POST -H "QB-Token: e7cde5f7f5b93f3fa5ac72a281777cbf0f908374" -F "field_name=avatar" -F 'file=@"ava.jpg"' https://api.quickblox.com/data/<Class_name>/<record_id>/file.json

此描述与其他描述之间的一个主要区别是我不确定如何处理的“-F”。这是迄今为止我尝试过的代码的一种变体:

Alamofire.upload(Method.POST, "https://api.quickblox.com/data/MyClassName/\(cusObjID)/file.json",
                            headers: ["QB-Token":realToken],
                            multipartFormData:  multipartFormData in

                                if let valData = "FieldName".dataUsingEncoding(NSUTF8StringEncoding) 
                                    multipartFormData.appendBodyPart(data: valData, name: "field_name")
                                
                                multipartFormData.appendBodyPart(data: theData, name: "ThisFileName", fileName: "ThisFileName.sqlite", mimeType: "multipart/form-data")
                            ,
                            encodingCompletion:  encodingResult in
                                switch encodingResult 
                                case .Success(let upload, _, _):
                                    upload.responseJSON  response in
                                        debugPrint(response)
                                    
                                case .Failure(let encodingError):
                                    print(encodingError)
                                
                            

我知道令牌和自定义对象 ID (cusObjID) 有效,因为我在其他请求中使用过它们。我在“appendBodyPart”部分尝试了很多变化,它们都给了我这个结果:

[Result]: SUCCESS: 
errors =     (
    "Wrong arguments"
);

响应已包含

Status = "404 Not Found";

我在 *** 上看到了一些答案,表明 Alamofire 可能不适用于这种类型的上传,所以如果有其他方法可以实现这一点,那也很棒。真的,我正在寻找任何方法来完成我在 iOS 上使用 iOS Quickblox SDK 所做的工作。

更新

使用此问题的最后一个答案 (Uploading file with parameters using Alamofire) 的编辑,我已经能够在文件上传时获得更新进度

.progress  (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in
                                Swift.print("\(totalBytesWritten) / \(totalBytesExpectedToWrite)")
                            

但我仍然遇到同样的错误。顺便说一句,这是我的请求标头在成功的 iOS 版本中的样子:

Request headers: 
    "Accept-Language" = "en-US;q=1";
    "Content-Length" = 6488309;
    "Content-Type" = "multipart/form-data; boundary=Boundary+88AB02F344BB7C4E";
    "QB-Token" = b6f06b9e6e45c839aecc89019add6bd1;
    "User-Agent" = "App Name/2.1 (iPhone; iOS 9.3; Scale/2.00)";

【问题讨论】:

【参考方案1】:

好吧,我在使用 Alamofire 时挣扎了一段时间,但始终没有让它做我想做的事。我切换到另一个框架 SwiftHTTP (https://github.com/daltoniam/SwiftHTTP),它能够毫不费力地完成任务(与使用 Quickblox iOS SDK 一样容易):

do 
     let opt = try HTTP.POST("https://api.quickblox.com/data/MyClassName/\(cusObjID)/file.json", parameters: ["field_name": "FieldName", "file": Upload(fileUrl: url)], headers: ["QB-Token":realToken])
     opt.start  response in
            if response.error == nil 

             else 
                 showError()
            
     
 catch 
    showError()

【讨论】:

以上是关于无需 SDK 将文件上传到 Quickblox,最好使用 Alamofire的主要内容,如果未能解决你的问题,请参考以下文章

将 Quickblox sdk 从 3.3.5 升级到 3.4.1 期间出现更新错误

在 IOS 中使用 QuickBlox 视频聊天,无需登录或密码

无法将 Quickblox Sdk 2.4 指向或配置到 android 应用程序中的新(跟踪)实例

Quickblox 内容与自定义对象文件

Gradle 构建问题:在最新的 Android SDK23 上升级 Quickblox 和 httpclient

在集成 Quickblox SDK 时限制发送状态的数量