13

Używam NSURLSessionUploadTask do przesłania pliku.NSURLSessionUploadTask, jak odczytać odpowiedź serwera

Oto niektóre części mojego kodu nie ukończyć

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

let sessionTask:NSURLSessionUploadTask = session.uploadTaskWithStreamedRequest(request 

Ale problem jest nie jestem w stanie uzyskać odpowiedź JSON serwer odsyła.

Poniższy delegat również nie wypalanie ale inni uczestnicy strzelają

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

kod, który używam:

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

Mam odpowiadało delegatów

  1. NSURLSessionDataDelegate
  2. NSURLSessionDelegate
  3. NSURLSessionTaskDelegate

Dzięki

+0

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

+0

O ile mi wiadomo, w zadaniu upload nie ma możliwości odczytania danych respsone serwera ... . możemy uzyskać pola nagłówka odpowiedzi serwera, ale nie dane ładunku, które wysyła serwer. Popraw mnie, jeśli się mylę. –

+1

Jakie inne delegaty są zwalniane? – Larme

Odpowiedz

1

Nie należy używać uploadTaskWithStreamedRequest: jeśli tworzysz danych podczas tworzenia żądania. Jest to przeznaczone do przesyłania ogromnych porcji danych, w których trzeba odczytywać dane z pliku i kodować je po trochu, przesyłając po trochu na raz. (I tak jak wspomniano, musisz podać metodę needNewBodyStream, jeśli to zrobisz.)

Prawdopodobnie powinieneś używać uploadTaskWithRequest:fromData: i dostarczać blob danych ciała jako parametr fromData.

Nie trzeba również ustawiać danych podstawowych w żądaniu. NSURLSession ignoruje to z reguły.

Możesz również rozważyć opcję uploadTaskWithRequest:fromData:completionHandler:, która pozwoli ci określić blok do uruchamiania z całymi danymi po zakończeniu przesyłania, co nie wymaga podania metody delegowania danych.

+0

Więc w takim razie, czy mogę uzyskać procent przesyłu danych z danymi odpowiedzi? –

+0

Mam jeszcze spróbować Mam nadzieję, że to rozwiązanie zadziała –

+1

Ja * myślę, że metody delegowania nadal będą uruchamiane, gdy użyjesz procedury obsługi zakończenia. Ale nawet jeśli nie, zadania ** NSURLSession ** w pełni obsługują obserwacje klucz-wartość, więc zawsze możesz obserwować zmiany właściwości 'countOfBytesSent' i' countOfBytesExpectedToSend' w zadaniu i ponownie obliczać procent przesyłania, gdy którakolwiek z tych wartości zmiany. – dgatwood

0

Jak NSURLSessionUploadTask jest podklasą NSURLSessionDataTask, można spróbować użyć metody z NSURLSessionDataDelegate:

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

Zgodnie z dokumentacją:

opowiada delegata, że ​​zadanie dane otrzymane wstępną odpowiedź (nagłówki) z serwera.

+0

Nie mogłem uzyskać danych JSON, które serwer odsyła z powrotem ... Nie znajduję żadnej innej metody, która daje dane json, które serwer odsyła –

Powiązane problemy