2017-11-01 2 views
1

Ich weiß, dass diese Frage vor ein paar Mal gestellt wurde, here, here und möglicherweise noch viele Male. Ich habe alle diese Antworten versucht, aber keiner von ihnen funktioniert für das, was ich versuche zu tun.Wie kann ich ein UIImage mit Swift als 'source =' Parameter in swift3 in eine REST API hochladen?

Im Wesentlichen versuche ich eine UIImage an die Kairos API anzuschließen. Ich mache eine einfache POST-Anfrage mit einem source Parameter in der Anfrage. Die Anfrage gibt ein JSON-Objekt mit verschiedenen Datenpunkten zurück, die ich in meiner Anwendung verwenden möchte. Die meisten Antworten, die ich über das Hochladen von Image-Dateien gesehen habe, verwenden eine multipart-form-data Anfrage, aber ich bin mir nicht sicher, wie dies mit dem source Parameter verbunden wäre, den die API in der Anfrage verlangt. Ich weiß, wie ich in den Authentifizierungsabschnitt als Header zu meinem URLRequest hinzufügen kann, ich brauche nur Hilfe beim Hochladen des Bildes als source Parameter.

Dieser CURL Code funktioniert:

curl -X POST -H "app_id: XXX" -H "app_key: YYY" -F "[email protected]/Users/myusername/Desktop/myimage.jpg" "https://api.kairos.com/v2/media" 

Aber ich bin nicht sicher, wie ich einen solchen Code zu Swift umwandeln kann.

Am liebsten würde ich traditionelle URLRequests and URLSessions anstelle externer Bibliotheken von Drittanbietern verwenden (aufgrund einiger Blogposts, die ich gelesen habe, die die Gefahr der Verwendung von Third-Party-Bibliotheken erwähnen). Kann mir jemand helfen?

Vielen Dank im Voraus!

+0

-F in curl bedeutet nur Formulardaten. Zur Referenz https://github.com/newfivefour/BlogPosts/blob/master/swift-form-data-multipart-upload-URLRequest.md –

+0

@RikeshSubedi Danke! Würde es Ihnen etwas ausmachen, hier eine Antwort mit dem genauen Code hinzuzufügen, dem ich folgen könnte? Der Link, den Sie hinzugefügt haben, ist eine der Ressourcen, die ich versucht habe (aber vergessen zu erwähnen). Ist es möglich, dass Sie Code aus dem Link hinzufügen, den ich für genau diesen Fall verwenden könnte? Vielen Dank! – sccoding

Antwort

1

Der Code sollte so sein.

 let url = URL(string: "https://api.kairos.com/v2/media") 
     var urlRequest = URLRequest(url: url!) 
     urlRequest.httpMethod = "POST" 
     urlRequest.addValue("XXX", forHTTPHeaderField: "app_id") 
     urlRequest.addValue("YYY", forHTTPHeaderField: "app_key") 
     let boundary = "Boundary-\(UUID().uuidString)" 
     urlRequest.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") 


     //image data 
     let image = UIImage() //replace with your image 
     let fileName = "myimage.jpg" 
     let data = UIImageJPEGRepresentation(image, 0.7)! 

     //create body 
     let body = NSMutableData() 

     //append first line 
     let line1_boundryPrefix = "--\(boundary)\r\n" 
     body.append(line1_boundryPrefix.data(
      using: String.Encoding.utf8, 
      allowLossyConversion: false)!) 

     //append second line 
     let line2_parameter = "Content-Disposition: form-data; name=\"source\"; filename=\"" + fileName + "\"\r\n" 
     body.append(line2_parameter.data(
      using: String.Encoding.utf8, 
      allowLossyConversion: false)!) 

     //append third line (mime type) 
     let mimeType = "image/jpg" 
     let line3_contentType = "Content-Type: \(mimeType)\r\n\r\n" 
     body.append(line3_contentType.data(
      using: String.Encoding.utf8, 
      allowLossyConversion: false)!) 

     //append image data 
     //line4 
     body.append(data) 


     let line5 = "\r\n" 
     body.append(line5.data(
      using: String.Encoding.utf8, 
      allowLossyConversion: false)!) 


     let line6 = "--" + boundary + "--\r\n" 
     body.append(line6.data(
      using: String.Encoding.utf8, 
      allowLossyConversion: false)!) 
     urlRequest.httpBody = body as Data 
     urlRequest.setValue(String(body.length), forHTTPHeaderField: "Content-Length") 

     URLSession.shared.dataTask(with: urlRequest) { (data, urlResponse, error) in 
      //handle callback 
     } 
Verwandte Themen