2016-08-14 6 views
1

Ich versuche, eine SQLite-Datei von einem OS X-Projekt, das in Swift geschrieben wurde, auf Quickblox-Server hochzuladen. Ich habe dies bereits heraus auf iOS mit dem Quickblox iOS SDK:Hochladen von Datei zu Quickblox ohne SDK, idealerweise mit 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() 
        }) 

Mit OS X, ich habe mit Alamofire worden und haben andere Anfragen bekommen zu arbeiten, aber nicht diese. Die Beschreibung der Anfrage auf ihrer API-Seite (https://quickblox.com/developers/Custom_Objects#Upload.2FUpdate_file) ist dies:

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 

Ein Hauptunterschied zwischen dieser Beschreibung und anderen die „-F“ s, die ich bin nicht sicher, was mit zu tun. Hier ist eine Variation des Code, den ich habe versucht, so weit:

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) 
           } 
          } 

weiß, dass ich das Token und die benutzerdefinierten Objekt-ID (cusObjID) arbeitet, weil ich sie in anderen Anfragen verwendet habe. Ich habe jede Menge Variationen versucht, auf den „appendBodyPart“ Teile, und sie haben alle mir dieses Ergebnis gegeben:

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

und die Antwort hat

enthalten
Status = "404 Not Found"; 

Ich habe einige Antworten gesehen hier auf StackOverflow, das darauf hindeutet, dass Alamofire für diese Art des Uploads möglicherweise nicht funktioniert, wäre also auch eine gute Möglichkeit, dies zu erreichen. Wirklich, jede Möglichkeit, zu erreichen, was ich mit dem iOS Quickblox SDK auf iOS gemacht habe, ist, was ich suche.

UPDATE

bearbeitet der letzten Antwort auf diese Frage verwenden (Uploading file with parameters using Alamofire), ich habe in der Lage, den Fortschritt zu erhalten, wie die Datei-Uploads ich

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

aber dennoch aktualisieren bekomme immer noch die gleichen Fehler. By the way, ist das, was meine Request-Header wie aus der erfolgreichen iOS-Version aussieht:

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)"; 
} 

Antwort

2

OK, ich eine Weile mit Alamofire kämpfte und bekam es nie zu tun, was ich wollte es. Ich wechselte zu einem anderen Rahmen, SwiftHTTP (https://github.com/daltoniam/SwiftHTTP), die die Aufgabe abzuschließen mühelos konnte (etwa so einfach wie mit dem 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() 
} 
Verwandte Themen