2017-08-12 1 views
7

Ich muss die Multipart-Anfrage mit Image-Datei und JSON aufrufen.Laden Sie Foto/Datei mit JSON und benutzerdefinierten Headern über Swift 3 und Alamofire 4 | hoch iOS | Swift

Ich habe dies versucht, aber immer noch den Fehler.

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

Wie wird der JSON gesendet?

+0

erhalten Sie einen Fehler auf dieser Schnipsel? –

+0

JA, ich erhalte HTTP CODE 400 mit Nachricht - Ungültige Anfrage. –

+0

kann ich eine Anfrage-URL haben? damit ich es besser prüfen kann –

Antwort

3

Dieser Code für mehrere Bilder Versuchen in Single Request wird dieser Code bereits arbeiten.

 // 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]) 
     } 
    } 

Upload-Funktion

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

Danke, es funktioniert;) –

2

Aus Daten, die Sie angegeben haben, komme ich zu einer Schlussfolgerung wie unten angegeben.

Der Statuscode 400 bedeutet, dass json, das Sie an die API weitergeben, nicht der API-Dokumentation folgte. Zum Beispiel, wenn sie einen Schlüssel "Name" erwarten und Sie einen solchen Schlüssel überhaupt nicht erhalten.

Andere mögliche Gründe für diesen Fehler.

Scheint, wie Sie nicht von Inhaltstypen

hinzufügen erwähnt haben diese Codezeile, um sicherzustellen, dass die Antwort und Ihre Anfrage sind in der richtigen Formate

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

Der Accept-Header der sagt Server, was Ihr Client in der Antwort wünscht. Der Content-Type-Header teilt dem Server mit, was der Client in der Anfrage sendet.

Wenn Sie mehr Informationen geben können, können wir weiter helfen.

1

Hier habe ich meinen eigenen Webservice erstellt, den Sie verwenden können. Dieser Webservice dient zum Hochladen von Wörterbuch mit Bild und Video oder beides oder ohne.

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

Verbrauch:

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) 
} 
Verwandte Themen