2017-01-10 3 views
2

Я использую Alamofire 4 with swift 3 для обновления профиля пользователя. а также я использую класс Router. Мне нужно uplaod и изображение с другими параметрами. Я могу update подробно пользователей, не загружая часть изображения.Как загрузить изображение в качестве параметра, с другими параметрами, используя данные о multipart form в ios, swift3, Alamofire 4

это то, что он выглядит в postman

enter image description here

так возможно создать urlconvertible запрос для этого. как я могу загрузить изображение с другими параметрами. (это прекрасно работает в почтальоне). как я могу это сделать с новыми Alamofire. Я попробовал это, как показано ниже.

let parameters = [ 
      "profile_image": "swift_file.jpeg" 
     ] 


     Alamofire.upload(multipartFormData: { (multipartFormData) in 
      multipartFormData.append(UIImageJPEGRepresentation(profileImage, 1)!, withName: "file", fileName: "swift_file.jpeg", mimeType: "image/png") 
      for (key, value) in parameters { 
       multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key) 
      } 
     }, to:urltoUpdate) 
     { (result) in 
      switch result { 
      case .success(let upload, _, _): 
       print("the status code is :") 

       upload.uploadProgress(closure: { (progress) in 
        print("something") 
       }) 

       upload.responseJSON { response in 
        print("the resopnse code is : \(response.response?.statusCode)") 
        print("the response is : \(response)") 
       } 
       break 
      case .failure(let encodingError): 
       print("the error is : \(encodingError.localizedDescription)") 
       break 
      } 
     } 

но это не работает должным образом. надеюсь, ваша помощь с этой частью.

ответ

4

Вам не нужно это:

"profile_image": "swift_file.jpeg" 

и параметры должны быть:

let parameters = [ 
    "firstname": "Bill", 
    "surname": "fox", 
    //...rest of the parameters 
] 

И это withName: "file":

multipartFormData.append(UIImageJPEGRepresentation(profileImage, 1)!, withName: "file", fileName: "swift_file.jpeg", mimeType: "image/png") 

Должно быть withName: "profile_image":

multipartFormData.append(UIImageJPEGRepresentation(profileImage, 1)!, withName: "profile_image", fileName: "swift_file.jpeg", mimeType: "image/png") 

код с заголовками:

let parameters = [ 
    "firstname": "Bill", 
    "surname": "fox", 
    //...rest of the parameters 
] 

let headers = [ 
    "somekey": "somevalue", 
    //...rest of the parameters 
] 

Alamofire.upload(multipartFormData: { (multipartFormData) in 

    multipartFormData.append(UIImageJPEGRepresentation(profileImage, 1)!, withName: "profile_image", fileName: "swift_file.jpeg", mimeType: "image/png") 

    for (key, value) in parameters { 
     multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key) 
    } 

}, usingThreshold:UInt64.init(), 
    to: "", //URL Here 
    method: .post, 
    headers: headers, //pass header dictionary here 
    encodingCompletion: { (result) in 

    switch result { 
    case .success(let upload, _, _): 
     print("the status code is :") 

     upload.uploadProgress(closure: { (progress) in 
      print("something") 
     }) 

     upload.responseJSON { response in 
      print("the resopnse code is : \(response.response?.statusCode)") 
      print("the response is : \(response)") 
     } 
     break 
    case .failure(let encodingError): 
     print("the error is : \(encodingError.localizedDescription)") 
     break 
    } 
}) 
+0

И я также сомневаюсь в 'mimeType:" image/png "', потому что вы отправляете изображение в формате JPEG. –

+0

, так как я могу загрузить другие параметры с помощью этого 'firstname, latname, например' –

+0

Обновленный код 'for (key, value) в параметрах {' loop уже привязывает параметры с телом запроса. –

0

Просто Поместите этот метод в NSObjecte File.

импорт Alamofire`

class func postImageToUrl(_ serverlink:String,methodname:String,param:NSDictionary,image:UIImage!,withImageName : String,CompletionHandler:@escaping (Bool,NSDictionary) ->()) { 



     print("POST : " + serverlink + methodname + " and Param \(param) ") 

     var fullLink = serverlink 

     if fullLink.characters.count > 0 { 

      fullLink = serverlink + "/" + methodname 
     } 
     else { 

      fullLink = methodname 
     } 

     var imgData = Data() 
     if image != nil { 

      imgData = UIImageJPEGRepresentation(image!, 1.0)! 
     } 

     let notallowchar : CharacterSet = CharacterSet(charactersIn: "").inverted 
     let dateStr:String = "\(Date())" 
     let resultStr:String = (dateStr.components(separatedBy: notallowchar) as NSArray).componentsJoined(by: "") 
     let imagefilename = resultStr + ".jpg" 

     Alamofire.upload(multipartFormData:{ multipartFormData in 
      multipartFormData.append(imgData, withName: withImageName as String, fileName: imagefilename, mimeType: "image/jpeg") 

      for (key, value) in param { 

       //let data = (value as! String).data(using: String.Encoding.utf8)! 
       let data = (value as AnyObject).data(using: String.Encoding.utf8.rawValue) 
       multipartFormData.append(data!, withName: key as! String) 

      } 
     }, 
     usingThreshold:UInt64.init(), 
     to:fullLink, 
     method:.post, 
     headers:[:], 
     encodingCompletion: { encodingResult in 

      switch encodingResult { 

       case .success(let upload, _, _): 

       upload.uploadProgress { progress in // main queue by default 

        print("Upload Progress: \(progress.fractionCompleted)") 
       } 

       upload.responseJSON { response in 

        print(response) 


        if let TempresponseDict:NSDictionary = response.result.value as? NSDictionary { 

         if (TempresponseDict.object(forKey: "response") as? String)?.caseInsensitiveCompare("success") == .orderedSame { 

          CompletionHandler(true, TempresponseDict) 
         } 
         else { 

          var statusCode = response.response?.statusCode 

          if let error = response.result.error as? AFError { 

           statusCode = error._code // statusCode private 

           switch error { 

           case .invalidURL(let url): 
            print("Invalid URL: \(url) - \(error.localizedDescription)") 
           case .parameterEncodingFailed(let reason): 
            print("Parameter encoding failed: \(error.localizedDescription)") 
            print("Failure Reason: \(reason)") 
           case .multipartEncodingFailed(let reason): 
            print("Multipart encoding failed: \(error.localizedDescription)") 
            print("Failure Reason: \(reason)") 
           case .responseValidationFailed(let reason): 
            print("Response validation failed: \(error.localizedDescription)") 
            print("Failure Reason: \(reason)") 

            switch reason { 

            case .dataFileNil, .dataFileReadFailed: 
             print("Downloaded file could not be read") 
            case .missingContentType(let acceptableContentTypes): 
             print("Content Type Missing: \(acceptableContentTypes)") 
            case .unacceptableContentType(let acceptableContentTypes, let responseContentType): 
             print("Response content type: \(responseContentType) was unacceptable: \(acceptableContentTypes)") 
            case .unacceptableStatusCode(let code): 
             print("Response status code was unacceptable: \(code)") 
             statusCode = code 
            } 
           case .responseSerializationFailed(let reason): 

            print("Response serialization failed: \(error.localizedDescription)") 
            print("Failure Reason: \(reason)") 
            // statusCode = 3840 ???? maybe.. 
           } 

           print("Underlying error: \(error.underlyingError)") 
          } 
          else if let error = response.result.error as? URLError { 

           print("URLError occurred: \(error)") 
          } 
          else { 

           print("Unknown error: \(response.result.error)") 
          } 

          print("\(statusCode)") // the status code 


          CompletionHandler(false, TempresponseDict) 
         } 
        } 
        else { 

         CompletionHandler(false, NSDictionary()) 
        } 
       } 

       case .failure(let encodingError): 

        print(encodingError) 

        CompletionHandler(false, NSDictionary()) 
      } 
     }) 

} 

2. Использование

yourNSObjectClassName.postImageToUrl(MAIN_LINK, methodname: "MethodName", param: "ParametterInDictionary", image: "UploadImage", withImageName: "ImageParametterString") { (Success, responceOBJ) in 
     if Success == true 
     { 
      print("Your image is uploaded") 
     } 
     else 
     { 
      print("Fail") 
     } 
    } 

И Вы установите код ошибки веб-сервиса на сервере сайта, чтобы показать ошибку и после того, как вы получаете право успеха.