2017-08-12 20 views
7

मुझे छवि फ़ाइल और JSON के साथ मल्टीपार्ट अनुरोध को कॉल करने की आवश्यकता है।स्विफ्ट 3 और अलामोफायर 4 के माध्यम से जेएसओएन और कस्टम हेडर के साथ फोटो/फ़ाइल अपलोड करें। आईओएस | स्विफ्ट

मैंने कोशिश की है, लेकिन अभी भी त्रुटि प्राप्त हो रही है।

// define parameters 
    let parameters = [ 
    "hometown": "yalikavak", 
    "living": "istanbul" 
    ] 

Alamofire.upload(multipartFormData: { multipartFormData in 
    if let imageData = UIImageJPEGRepresentation(image, 1) { 
     multipartFormData.append(imageData, withName: "file", fileName: "file.png", mimeType: "image/png") 
    } 

    for (key, value) in parameters { 
     multipartFormData.append((value?.data(using: .utf8))!, withName: key) 
    }}, to: "upload_url", method: .post, headers: ["Authorization": "auth_token"], 
     encodingCompletion: { encodingResult in 
      switch encodingResult { 
      case .success(let upload, _, _): 
      upload.response { [weak self] response in 
       guard let strongSelf = self else { 
       return 
       } 
       debugPrint(response) 
      } 
      case .failure(let encodingError): 
      print("error:\(encodingError)") 
      } 
    }) 
} 

JSON कैसे भेजें?

+0

आप इस टुकड़ा पर किसी भी त्रुटि मिल रहा है? –

+0

हां, मुझे संदेश के साथ HTTP कोड 400 मिल रहा है - खराब अनुरोध। –

+0

क्या मेरे पास अनुरोध यूआरएल हो सकता है? तो मैं इसे बेहतर तरीके से कोशिश कर सकता हूं और इसे देख सकता हूं –

उत्तर

3

प्रयास करें एक अनुरोध में एकाधिक अपलोड छवियाँ के लिए इस कोड, इस कोड को पहले से ही काम कर रहा है।

 // For Pass Valid Parameters & number of Images in Array in Image Upload Function 
    var dicImgData : NSMutableDictionary? = NSMutableDictionary() 

    if let img = UIImage(named: "Your Image") { 
     if let data:Data = UIImagePNGRepresentation(img) { 
      var imageData : NSData = data 
      dicImgData! .setObject(imageData, forKey: "data" as NSCopying) 
      dicImgData! .setObject("file", forKey: "name" as NSCopying) 
      dicImgData! .setObject("file.png", forKey: "fileName" as NSCopying) 
      dicImgData! .setObject("image/png", forKey: "type" as NSCopying) 

      let dicParameter = [ 
       "hometown": "yalikavak", 
       "living": "istanbul" 
      ] 

      self.uploadImage(url: "Your URL", Parameter: dicParameter, Images: [dicImgData]) 
     } 
    } 

अपलोड समारोह

func uploadImage (url: String, Parameter param : NSDictionary, Images arrImage: NSArray) -> Void 
    { 
     var requestURL : String! = url 
     let headers = [ 
      "Authorization": "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==", 
      "Accept": "application/json", 
      ] 

     print("---------------------") 
     print("Request URL :- \(requestURL)") 
     print("---------------------") 

     Alamofire.upload(multipartFormData: { (data) in 

      for (key, value) in param { 
       data.append((value as! String).data(using: .utf8)!, withName: key as! String) 
      } 

      for imageInfo in arrImage 
      { 
       var dicInfo : NSDictionary! = imageInfo as! NSDictionary 
       data.append(dicInfo["data"] as! Data, withName: dicInfo["name"] as! String, fileName: dicInfo["fileName"] as! String, mimeType: dicInfo["type"] as! String) 
       dicInfo = nil 
      } 

     }, to: requestURL, method: .post , headers:nil, encodingCompletion: { (encodeResult) in 
      switch encodeResult { 
      case .success(let upload, _, _): 

       upload.responseJSON(completionHandler: { (response) in 

        switch response.result 
        { 
        case .success(let responseJSON): 
         guard let dicResponse = responseJSON as? NSDictionary else{ 
          return 
         } 

         print("Response : \((dicResponse))") 

        case .failure(let error): 

         print(error) 

         break 
        } 
       }) 
      case .failure(let error): 
       print(error) 
       break 
      } 
     }) 
    } 
+2

धन्यवाद, यह काम करता है;) –

2

आंकड़ों से आप दे दिया है, मैं नीचे दिए गए एक निष्कर्ष पर आता है।

स्थिति कोड 400 json एपीआई को गुजर रहे API दस्तावेज़ों का पालन नहीं कर रहा था मतलब है। उदाहरण के लिए यदि वे एक कुंजी "नाम" की अपेक्षा करते हैं और आपको ऐसी कुंजी नहीं दी जाती है।

इस त्रुटि के लिए अन्य संभावित कारण।

लगता है आप सामग्री प्रकार

कोड के इन लाइन जोड़े के किसी भी उल्लेख नहीं किया है की तरह आश्वस्त करने के लिए कि प्रतिक्रिया और आपके अनुरोध उचित प्रारूप में हैं

Alamofire.request(.GET, "your url", parameters: ["foo": "bar"]) 
     .validate(statusCode: 200..<300) 
     .validate(contentType: ["application/json"]) 
     .response { (_, _, _, error) in 
        println(error) 
     } 

स्वीकार हैडर बताता है सर्वर प्रतिक्रिया में आपका ग्राहक क्या चाहता है। सामग्री-प्रकार शीर्षलेख सर्वर को बताता है कि ग्राहक अनुरोध में भेजता है।

यदि आप अधिक जानकारी दे सकते हैं तो हम आगे की मदद कर सकते हैं।

1

यहां मैंने अपना कस्टम webservice बनाया है, आप इसका उपयोग कर सकते हैं। यह webservice छवि और वीडियो या दोनों के बिना अपलोड शब्दकोश के लिए है।

import Foundation 
import Alamofire 
class WebServiceHandler: AnyObject { 

    func uploadWithAlamofire(Parameters params : [NSObject : AnyObject]?,ImageParameters imgparams : [NSObject : AnyObject]?,VideoParameters vidoparam : [NSObject : AnyObject]?,Action action : NSString, success: @escaping (AnyObject) -> Void, failure: @escaping (AnyObject) -> Void) 
    { 
     var base_url = "http://benzatineinfotech.com/webservice/finder/index.php/Web_api/" 
     base_url.append(action as String) 

     Alamofire.upload(multipartFormData: { multipartFormData in 
      if imgparams != nil{ 
       for (key, value) in imgparams! { 
        if let imageData = UIImageJPEGRepresentation(value as! UIImage, 1) { 
         multipartFormData.append(imageData, withName: key as! String, fileName: "\(NSDate().timeIntervalSince1970 * 1000)).jpg", mimeType: "image/jpg") 
        } 
       } 
      } 
      if vidoparam != nil{ 
       for (key, value) in vidoparam! { 
        multipartFormData.append(value as! URL , withName: key as! String, fileName: "\(NSDate().timeIntervalSince1970 * 1000).mp4", mimeType: "application/octet-stream") 
       } 
      } 
      if params != nil 
      { 
       for (key, value) in params! { 
        multipartFormData.append((value as! String).data(using: .utf8)!, withName: key as! String) 
       } 

      } }, to: base_url, method: .post, headers: nil, 
       encodingCompletion: { encodingResult in 
        switch encodingResult { 
        case .success(let upload, _, _): 
         upload.uploadProgress { progress in 
          print(progress.fractionCompleted) 
         } 
         upload.response { [weak self] response in 
          guard self != nil else { 
           return 
          } 
          let responseString = String(data: response.data!, encoding: String.Encoding.utf8) 
          return success(responseString as AnyObject) 

         } 
        case .failure(let encodingError): 
         print("error:\(encodingError)") 
         return failure(encodingError as AnyObject) 
        } 
     }) 
    } 
    func convertToDictionary(text: String) -> [String: Any]? { 
     if let data = text.data(using: .utf8) { 
      do { 
       return try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] 
      } catch { 
       print(error.localizedDescription) 
      } 
     } 
     return nil 
    } 
} 

उपयोग:

self.webservice.uploadWithAlamofire(Parameters: dict_params as [NSObject : AnyObject], ImageParameters: imgparam as [NSObject : AnyObject], VideoParameters: videoparam as [NSObject : AnyObject], Action: "write_message", success: { (success) in 
     print(success) 
}) { (error) in 
     print(error) 
} 
संबंधित मुद्दे