2017-05-22 2 views
1

Sie hatten Schwierigkeiten, dieses herauszufinden. Post-Anfragen mit Alamofire (4.4.0) und meinen Headern funktionieren für die meisten Dinge gut, aber dieses Mal muss ich ein Wörterbuch mit Strings und ein Video senden.Hinzufügen von Headern zu Alamofire multiPartFormData Upload

Das Video wird über einen UIImagePickerController aufgezeichnet und die Informationen, die es schließlich zum Wörterbuch machen, werden über eine Reihe von Schiebereglern, Schaltern und Textfeldern erstellt.

Der Block, der Mühe gegeben mich ist wie folgt:

let headers: HTTPHeaders = [ 
     "X-Access-Token": self.user 
    ] 
let requestUrl = try! URLRequest(url: "http://exampleUrl.com", method: .post, headers: headers) 

    upload(
     multipartFormData: { (multipartFormData) in 
      multipartFormData.append(videoURL!, withName: "video_source") 
      multipartFormData.append(self.alphaLabel.text!.data(using: .utf8)!, withName: "alpha") 
      multipartFormData.append(self.betaLabel.text!.data(using: .utf8)!, withName: "beta") 
      multipartFormData.append(self.gammaLabel.text!.data(using: .utf8)!, withName: "gamma") 
      multipartFormData.append(self.deltaTextField.text!.data(using: .utf8)!, withName: "delta") 
      multipartFormData.append(self.epsilonScrollPicker.data(using: .utf8)!, withName: "epsilon") 
      multipartFormData.append(zetaArray!.data(using: .utf8)!, withName: "zeta") 

     }, 
      to: requestUrl as! URLConvertible) { encodingResult in 
       switch encodingResult { 
       case .success (let upload, _, _): 
        upload.responseJSON { response in 
         print(response) 
        } 
       case .failure (let encodingError): 
        print(encodingError) 
      } 
     } 

Der obige Code gibt: "Gewinde 1: Signal SIGABRT"

Die Konsole Ausgänge: „konnte nicht werfen Wert Geben Sie 'Foundation.URLRequest' in 'Alamofire.URLConvertible' ein. "

Um zu überprüfen, um zu sehen, ob alles andere funktioniert, ich das lief:

let requestUrl "http://exampleUrl.com" 

upload(
    multipartFormData: { (multipartFormData) in 
     multipartFormData.append(videoURL!, withName: "video_source") 
     multipartFormData.append(self.alphaLabel.text!.data(using: .utf8)!, withName: "alpha") 
     multipartFormData.append(self.betaLabel.text!.data(using: .utf8)!, withName: "beta") 
     multipartFormData.append(self.gammaLabel.text!.data(using: .utf8)!, withName: "gamma") 
     multipartFormData.append(self.deltaTextField.text!.data(using: .utf8)!, withName: "delta") 
     multipartFormData.append(self.epsilonScrollPicker.data(using: .utf8)!, withName: "epsilon") 
     multipartFormData.append(zetaArray!.data(using: .utf8)!, withName: "zeta") 

    }, 
     to: requestUrl as! URLConvertible) { encodingResult in 
      switch encodingResult { 
      case .success (let upload, _, _): 
       upload.responseJSON { response in 
        print(response) 
       } 
      case .failure (let encodingError): 
       print(encodingError) 


     } 
    } 

Wenn ich eine andere URL verwenden, eine ohne andere Parameter, erhalte ich eine 401 - ungültige Zugriffstoken von meinem Server. Dies ist zu erwarten, da ich mit dieser neuen Anfrage keinen Header im Header übergeben kann.

Wenn jemand Licht auf, wie man einen Upload multiPartFormData Anfrage und haben eine Kopfzeile enthalten für die Authentifizierung, würde ich es schätzen wissen.

Antwort

1

Ich habe gerade Ihre Header in meinem Arbeitscode hinzugefügt. Sie können Ihren Code damit ersetzen.

let yourHeaders: HTTPHeaders = [ 
     "X-Access-Token": "dsfdsfdsf" 
    ] 

    Alamofire.upload(multipartFormData: { multipartFormData in 

     for (key, value) in parameter 
     { 
      multipartFormData.append(value.data(using: .utf8)! , withName: key) 
     } 
     for videoData in VideoDataArray 
     { 
      if videoData 
      { 
       multipartFormData.append(videoData , withName: videoParameterName, fileName: "videoName.mp4", mimeType: "video/mp4") 
      } 
     } 
    }, to: "YourApiUrlHere", method: .post, headers : yourHeaders, 
      encodingCompletion: { encodingResult in 
       switch encodingResult { 
       case .success(let upload, _, _): 
        print(upload.progress) 

        upload.responseJSON { response in 

         if let JSON = response.result.value 
         { 
          print("JSON: \(JSON)")        
        } 
        break 
       case .failure(_): 
        } 
       } 
     }) 
+0

Ich versuche nicht, ein Bild hochzuladen. Ich glaube also nicht, dass ich Ihre ** UIImageJPEGRepräsentation ** nutzen könnte. Wenn Sie nicht das Äquivalent für kUTTypeMovie kennen, weiß ich nicht, ob das, was Sie haben, für das, was ich brauche, funktioniert. –

+0

@NickDiVona Ich habe dir gesagt, fügen Sie Ihren Parameter hinzu und behandeln Sie die Antwort. Dies ist nur eine Darstellung von Almofire Method Call. Wenn Sie UIImageJPEGRepresentation wissen, geben Sie NSData zurück und Sie können dort Ihre Videodaten hinzufügen. – ChanWarde

+0

Ah ich sehe. Vielen Dank. –

Verwandte Themen