13

Ich verwende NSURLSessionUploadTask, um eine Datei hochzuladen.NSURLSessionUploadTask wie Serverantwort zu lesen

Hier sind einige Teile meines Code

let session:NSURLSession = NSURLSession(configuration: config, delegate: self, delegateQueue: NSOperationQueue .mainQueue()) 

let sessionTask:NSURLSessionUploadTask = session.uploadTaskWithStreamedRequest(request 

Aber das Problem ist, ich bin nicht in der Lage zu bekommen, die JSON-Antwort nicht vollständig der Server zurück sendet.

Die folgenden Delegierten Brennen auch nicht, aber andere Delegierte

func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) 

-Code feuern, die ich verwende:

func sendFileToServer1(fileName:String,fileData:NSData,serverURL:String){ 

let body = NSMutableData() 

let mimetype = "application/octet-stream" 
//  let mimetype = "video/quicktime" 

let boundary = "Boundary-\(NSUUID().UUIDString)" 
let url = NSURL(string: serverURL) 

let request = NSMutableURLRequest(URL: url!) 
request.HTTPMethod = "POST" 
request.setValue("multipart/form-data; boundary=----\(boundary)", forHTTPHeaderField: "Content-Type") 
body.appendData("------\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
body.appendData("Content-Disposition:form-data; name=\"file\"; filename=\"\(fileName)\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
body.appendData("Content-Type: \(mimetype)\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
body.appendData(fileData) 
body.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
body.appendData("------\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
body.appendData("Content-Disposition:form-data; name=\"submit\"\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
body.appendData("Submit\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
body.appendData("------\(boundary)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
request.HTTPBody=body 

let config:NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration() 
let session:NSURLSession = NSURLSession(configuration: config, delegate: self, delegateQueue: NSOperationQueue .mainQueue()) 
let sessionTask:NSURLSessionUploadTask = session.uploadTaskWithStreamedRequest(request) 
sessionTask.resume() 
} 

func URLSession(session: NSURLSession, didBecomeInvalidWithError error: NSError?) { 
    print("error") 
} 

func URLSession(session: NSURLSession, task: NSURLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) { 
    print("Bytes sent:\(bytesSent) Total bytes sent:\(totalBytesSent) Total bytes expected to send:\(totalBytesExpectedToSend)") 
} 

func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveResponse response: NSURLResponse, completionHandler: (NSURLSessionResponseDisposition) -> Void) { 
    print("response:\(response as! NSHTTPURLResponse)") 
} 

func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) { 
    print("data didReceiveData") 
} 

ich angepasst haben den Delegierten

  1. NSURLSessionDataDelegate
  2. NSURLSessionDelegate
  3. NSURLSessionTaskDelegate

Dank

+0

Verweise: https://www.raywenderlich.com/110458/nsurlsession-tutorial-getting-started – Santosh

+0

Soweit mir bekannt ist, In Upload-Aufgabe gibt es keine Möglichkeit, die Server-Responson Daten zu lesen ... .Wir können Server-Response-Header-Felder erhalten, aber keine Payload-Daten, die der Server sendet.Korrigieren Sie mich, wenn ich falsch liege –

+1

Welche anderen Delegaten werden gefeuert? – Larme

Antwort

1

Sie sollten verwenden uploadTaskWithStreamedRequest: nicht, wenn Sie die Daten sind zu schaffen, wenn Sie die Anforderung erstellen. Das ist für das Hochladen riesiger Datenmengen gedacht, wo Sie die Daten aus einer Datei lesen und sie ein Stück nach der anderen verschlüsseln müssen, um sie dann ein Stück nach dem anderen auszusenden. (Und wie erwähnt, müssen Sie die needNebodyStream-Methode bereitstellen, wenn Sie das tun.)

Wahrscheinlichkeiten sind, sollten Sie uploadTaskWithRequest:fromData: verwenden und das Body-Daten-Blob als fromData Parameter bereitstellen.

Sie müssen auch nicht die Körperdaten in der Anfrage festlegen. NSURLSession ignoriert das in der Regel.

Sie könnten auch uploadTaskWithRequest:fromData:completionHandler: in Erwägung ziehen, mit der Sie einen Block angeben können, der nach dem Hochladen mit den gesamten Daten ausgeführt wird. Dadurch müssen Sie keine Delegate-Methode zum Sammeln der Daten bereitstellen.

+0

Also in diesem Fall, kann ich den Prozentsatz des Hochladens sowie die Antwort-Nutzdaten erhalten? –

+0

Ich bin noch zu versuchen Ich hoffe, dass diese Lösung funktioniert –

+1

I * denke * die Delegate-Methoden für den Upload immer noch Feuer, wenn Sie einen Abschluss-Handler verwenden. Aber selbst wenn dies nicht der Fall ist, ** NSURLSession ** -Tasks unterstützen die Schlüsselwertbeobachtung vollständig, sodass Sie jederzeit Änderungen an den Eigenschaften "countOfBytesSent" und "countOfBytesExpectedToSend" für die Aufgabe beobachten und den Hochladeprozentsatz bei jedem dieser Werte neu berechnen können Änderungen. – dgatwood

0

Als NSURLSessionUploadTask ist eine Unterklasse von NSURLSessionDataTask, könnten Sie versuchen Methoden aus NSURLSessionDataDelegate mit:

func urlSession(_ session: NSURLSession, dataTask: NSURLSessionDataTask, didReceive response: NSURLResponse, completionHandler: (NSURLSession.ResponseDisposition) -> Void) 

Nach der Dokumentation:

Weist die Delegierten, dass die Daten Aufgabe, die ursprüngliche Antwort erhalten (Header) vom Server.

+0

Ich konnte die JSON-Daten, die der Server zurücksendet, nicht abrufen ... Ich finde keine andere Methode, die die JSON-Daten angibt, die der Server zurücksendet –