13

मैं फ़ाइल अपलोड करने के लिए 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

धन्यवाद

+0

इसे देखें: https://www.raywenderlich.com/110458/nsurlsession-tutorial-getting-started – Santosh

+0

जहां तक ​​मुझे पता है, अपलोड कार्य में सर्वर respsone डेटा को पढ़ने का कोई तरीका नहीं है ... हम सर्वर प्रतिक्रिया हेडर फ़ील्ड प्राप्त कर सकते हैं लेकिन सर्वर द्वारा भुगतान किए गए डेटा को पेलोड नहीं कर सकते हैं। अगर मैं गलत हूं तो मुझे सुधारें –

+1

अन्य प्रतिनिधि को निकाल दिया गया है? – Larme

उत्तर

1

आप uploadTaskWithStreamedRequest: नहीं का उपयोग करना चाहिए जब आप अनुरोध बनाने आप डेटा बना रहे हैं तो। इसका उद्देश्य डेटा के विशाल हिस्सों को अपलोड करने के लिए है जहां आपको फ़ाइल से डेटा पढ़ने की आवश्यकता होती है और इसे एक समय में थोड़ा सा एन्कोड करना होता है, इसे एक समय में थोड़ा सा भेजना पड़ता है। आप uploadTaskWithRequest:fromData: का उपयोग करना चाहिए और fromData पैरामीटर के रूप में शरीर डेटा ब्लॉब उपलब्ध कराने के (और के रूप में उल्लेख किया है, आप needNewBodyStream विधि प्रदान करने के लिए है, तो आप ऐसा कर सकते है।)

काफी संभावनाएँ हैं।

आपको अनुरोध में शरीर डेटा सेट करने की आवश्यकता नहीं है। NSURL सत्र एक नियम के रूप में अनदेखा करता है।

आप uploadTaskWithRequest:fromData:completionHandler: पर भी विचार कर सकते हैं, जो अपलोड समाप्त होने पर आपको संपूर्ण डेटा के साथ चलाने के लिए एक ब्लॉक निर्दिष्ट करने देगा, जिससे आप डेटा जमा करने के लिए एक प्रतिनिधि विधि प्रदान करने से बचा सकते हैं।

+0

तो उस मामले में, क्या मुझे अपलोड का प्रतिशत भी प्रतिक्रिया पेलोड डेटा मिल सकता है? –

+0

मुझे अभी तक कोशिश करने की उम्मीद है कि मुझे उम्मीद है कि यह समाधान –

+1

काम करता है * मुझे लगता है कि जब आप पूर्णता हैंडलर का उपयोग करते हैं तो अपलोड के लिए प्रतिनिधि विधियां अभी भी आग लगती हैं। लेकिन अगर वे नहीं करते हैं, तो ** NSURLSession ** कार्य पूरी तरह से महत्वपूर्ण मूल्य का समर्थन करते हैं, इसलिए आप हमेशा कार्य पर 'countOfBytesSent' और 'countOfBytesExpectedToSend' गुणों में परिवर्तनों का निरीक्षण कर सकते हैं और अपलोड मान को फिर से लागू कर सकते हैं परिवर्तन। – dgatwood

0

NSURLSessionUploadTask रूप NSURLSessionDataTask का एक उपवर्ग है, तो आप NSURLSessionDataDelegate से तरीकों का उपयोग कर की कोशिश कर सकते: (हेडर

प्रतिनिधि है कि डेटा कार्य प्रारंभिक उत्तर प्राप्त बताता है:

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

प्रलेखन के अनुसार) सर्वर से।

+0

मुझे जेएसओएन डेटा नहीं मिला जो सर्वर वापस भेजता है ... मुझे कोई अन्य विधि नहीं मिलती है जो जेसन डेटा देता है जो सर्वर वापस भेजता है –

संबंधित मुद्दे