13

私はNSURLSessionUploadTaskを使用してファイルをアップロードしています。ここで NSURLSessionUploadサーバーの応答を読み取る方法

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代表者

  1. に適合しているが
  2. NSURLSessionDelegate
  3. NSURLSessionTaskDelegate

おかげ

+0

これを参照してください:https://www.raywenderlich.com/110458/nsurlsession-tutorial-getting-started – Santosh

+0

私が知っている限り、アップロードタスクでは、respsoneサーバーのデータを読み取る方法はありません... 。私はサーバーの応答ヘッダーフィールドを取得できますが、サーバーが送信するペイロードデータは取得できません。私が間違っていると私を訂正します。 –

+1

他のどの代理者が解雇されますか? – Larme

答えて

1

あなたが要求を作成するときにデータを作成している場合は、uploadTaskWithStreamedRequest:を使用すべきではありません。これは、ファイルからデータを読み込んで一度に少しずつエンコードする必要がある膨大な量のデータをアップロードするためのもので、一度に少しずつ送信します。 (そうした場合は、前述のようにneedNewBodyStreamメソッドを提供する必要があります)

uploadTaskWithRequest:fromData:を使用し、fromDataパラメータとしてボディデータブロブを指定する必要があります。

また、リクエストでボディデータを設定する必要はありません。 NSURLSessionは、それを原則として無視します。

また、uploadTaskWithRequest:fromData:completionHandler:と考えると、アップロードが完了したときにデータ全体を実行するブロックを指定して、データを蓄積するための委任方法を提供する必要がなくなります。 NSURLSessionUploadTaskとして

+0

その場合、アップロードペイロードとレスポンスペイロードデータを得ることはできますか? –

+0

私はまだこのソリューションがうまくいきたいと思っています –

+1

私は思っています*完了ハンドラを使用すると、アップロード用のデリゲートメソッドはまだ起動します。しかし、そうでなくても** NSURLSession **タスクはキー値観測を完全にサポートしているので、タスクの 'countOfBytesSent'と' countOfBytesExpectedToSend'プロパティに対する変更を常に観測し、それらの値のいずれかがいつでもアップロードパーセンテージを再計算できます変更。 – dgatwood

0

NSURLSessionDataTaskのサブクラスである、あなたはNSURLSessionDataDelegateからメソッドを使用して試みることができる:

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

ドキュメントによると:

は、データタスクが初期応答(ヘッダを受けた代理人に指示します)をサーバーから削除します。

+0

サーバーから返されるJSONデータを取得できませんでした...他の方法でサーバーが返信するjsonデータを提供していません –

関連する問題