2016-08-14 51 views
1

我想從Swift中編寫的OS X項目上傳一個sqlite文件到Quickblox服務器。我已經與Quickblox的iOS SDK想通了這一點在iOS上:將文件上傳到沒有SDK的Quickblox,理想情況下與Alamofire

    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 '[email protected]"ava.jpg"' https://api.quickblox.com/data/<Class_name>/<record_id>/file.json 

一本說明書和其他人之間的主要區別是「-F」 S說我不知道​​該怎麼做。這是到目前爲止,我已經試過了代碼的一個變化:

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的StackOverflow可能不適用於這種類型的上傳,所以如果有其他方法可以實現這一點,那也會很棒。真的,任何方式來完成我在iOS上使用iOS Quickblox SDK所做的工作就是我正在尋找的。

UPDATE

使用這個問題(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)"; 
} 

回答

2

OK,我掙扎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() 
} 
相關問題