Подтвердить что ты не робот

NSURLSessionUploadTask, как читать ответ сервера

Я использую NSURLSessionUploadTask для загрузки файла.

Вот некоторые части моего кода не завершены

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

let sessionTask:NSURLSessionUploadTask = session.uploadTaskWithStreamedRequest(request

Но проблема в том, что я не могу получить ответ JSON, который сервер отправляет обратно.

Следующий делегат также не стреляет, а другие делегаты стреляют

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

Код, который я использую:

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

Я согласен с делегатами

  • NSURLSessionDataDelegate
  • NSURLSessionDelegate
  • NSURLSessionTaskDelegate

Спасибо

4b9b3361

Ответ 1

Нельзя использовать uploadTaskWithStreamedRequest:, если вы создаете данные при создании запроса. Это предназначено для загрузки огромных фрагментов данных, где вам нужно прочитать данные из файла и закодировать их понемногу, посылая их немного за раз. (И, как уже упоминалось, вы должны предоставить метод needNewBodyStream, если вы это сделаете.)

Скорее всего, вы должны использовать uploadTaskWithRequest:fromData: и предоставить BLOB тела как параметр fromData.

Вам также не нужно устанавливать данные тела в запросе. NSURLSession игнорирует это, как правило.

Вы также можете рассмотреть uploadTaskWithRequest:fromData:completionHandler:, который позволит вам указать блок для запуска со всеми данными при завершении загрузки, что избавит вас от необходимости предоставлять метод делегата для накопления данных.

Ответ 2

Поскольку NSURLSessionUploadTask является подклассом NSURLSessionDataTask, вы можете попробовать использовать методы из NSURLSessionDataDelegate:

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

Согласно документации:

Сообщает делегату, что задача данных получила исходный ответ (заголовки) с сервера.