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

我已经遵守了代表

  1. NSURLSessionDataDelegate
  2. NSURLSessionDelegate
  3. NSURLSessionTaskDelegate

谢谢

您不应该使用uploadTaskWithStreamedRequest:如果您在创build请求时创build数据。 这是为了上传大量的数据,你需要从一个文件中读取数据,并一次对它进行编码,每次发送一次。 (如前所述,如果你这样做,你必须提供needNewBodyStream方法。)

机会是,你应该使用uploadTaskWithRequest:fromData:并提供body数据blob作为fromData参数。

您也不需要在请求中设置正文数据。 作为一个规则NSURLSession忽略。

你也可以考虑uploadTaskWithRequest:fromData:completionHandler:它可以让你指定一个块,在上传完成时运行整个数据,节省你不必提供委托方法来累积数据。

由于NSURLSessionUploadTaskNSURLSessionUploadTask的子类, NSURLSessionDataTask可以尝试使用NSURLSessionDataDelegate方法:

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

根据文件:

告诉委托人数据任务从服务器收到初始答复(标题)。

Interesting Posts