2017-11-01 10 views
1

나는이 질문이 몇 번이나 전에 물어 보았다는 것을 알고있다. here, here 그리고 아마도 더 많은 시간이다. 나는 그 모든 답변을 시도했지만 그들 중 누구도 내가하려는 일을하지 않습니다.Swift를 사용하여 REST API에 UIImage를 업로드하려면 swift3에서 'source ='매개 변수로?

기본적으로 UIImage를 Kairos API에 연결하려고합니다. 요청에 source 매개 변수와 함께 간단한 POST 요청을 만들고 있습니다. 요청은 응용 프로그램에서 사용하고자하는 다양한 데이터 포인트가있는 JSON 객체를 반환합니다. 이미지 파일 업로드에 대해 본 응답의 대부분은 multipart-form-data 요청을 사용하지만 API가 요청할 때 source 매개 변수에 연결하는 방법에 대해 잘 모르겠습니다. 나는 내가 URLRequest에 헤더로 인증 섹션에 추가 할 수있는 방법을 알고, 그냥 source 매개 변수로 이미지를 업로드하는 데 도움이 필요합니다.

CURL 코드는 작동 :

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" 

을하지만, 내가 스위프트에 같은 코드를 변환하는 방법을 모르겠어요.

제 3 자 라이브러리가 아닌 전통적인 URLRequests and URLSessions을 사용하고 싶습니다. (제 3 자 라이브러리를 사용할 때의 위험성에 대해 언급 한 두 가지 블로그 게시물로 인해) 좋습니다. 아무도 나를 도울 수 있습니까?

미리 감사드립니다.

+0

-F는 양식 데이터만을 의미합니다. 참고로 https://github.com/newfivefour/BlogPosts/blob/master/swift-form-data-multipart-upload-URLRequest.md –

+0

@RikeshSubedi 감사합니다! 내가 따를 수있는 정확한 코드로 여기에 답변을 추가 하시겠습니까? 추가 한 링크는 내가 시도한 자료 중 하나입니다 (그러나 잊어 버렸습니다). 이 경우에 정확히 사용할 수있는 링크의 코드를 추가 할 수 있습니까? 감사! – sccoding

답변

1

코드가 이와 같아야합니다.

 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 
     }