Estoy desarrollando una aplicación para iPhone con swift. y soy utilizando Alamofire marco para el manejo de las peticiones http. Yo uso Alamofire.request para el POST , GET, etc como esta:

Alamofire.request(.POST, myURL , parameters: ["a": "1", "b" : "2" ])
        .response { (request, response, data, error) in
}  

Y yo uso Alamofire.upload para subir imágenes al servidor este :

Alamofire.upload(.POST, uploadURL , fileURL)

Y tanto funciona perfectamente, pero ahora quiero subir una imagen y también de enviar a algunos de los parámetros, y mi tipo de contenido debe ser multipart/form-data y Alamofire.upload no acepta parámetros.

Hay dos más pregunta por LO que alrededor de este tema con swift, que primero no está utilizando Alamofire (y realmente, ¿por qué no?) y en segundo, mattt (Alamofire Desarrollador) citó para el uso de los parámetros de codificación.

He comprobado su ejemplo, pero todavía no podía entender cómo hacerlo.

¿Puede alguien por favor me ayuden a resolver este problema?

Gracias! 🙂

  • Aquí está la solución que he encontrado, publicado a otra pregunta: stackoverflow.com/questions/26121827/…
  • Reza_Rg Puede ayudarme por favor? Yo también uso ‘Alamofire.subir(.POST, uploadURL , fileURL)’, pero ¿cómo tengo que estructura el archivo php para recibir el archivo? Donde está el archivo enviado a través de .POST disponible en mi archivo php?
  • ¿a resolver su problema, si es así puedes compartir una respuesta?
  • Sí, pero terminé cambiando algunos códigos en Alamofire de la biblioteca, que sé que no es la cosa correcta de hacer.
InformationsquelleAutor Reza_Rg | 2014-10-21

6 Comentarios

  1. 23

    puede utilizar Alamofire 3.0+ a continuación el código

    func uploadImageAndData(){
        //parameters
        let gender    = "M"
        let firstName = "firstName"
        let lastName  = "lastName"
        let dob       = "11-Jan-2000"
        let aboutme   = "aboutme"
        let token     = "token"
    
        var parameters = [String:AnyObject]()
        parameters = ["gender":gender,
                      "firstName":firstName,
                      "dob":dob,
                      "aboutme":about,
                      "token":token,
                      "lastName":lastName]
    
        let URL = "http://yourserviceurl/"
        let image = UIImage(named: "image.png")
    
        Alamofire.upload(.POST, URL, multipartFormData: {
            multipartFormData in
    
            if let imageData = UIImageJPEGRepresentation(image, 0.6) {
                multipartFormData.appendBodyPart(data: imageData, name: "image", fileName: "file.png", mimeType: "image/png")
            }
    
            for (key, value) in parameters {
                multipartFormData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key)
            }
        }, encodingCompletion: {
            encodingResult in
    
            switch encodingResult {
            case .Success(let upload, _, _):
                print("s")
                upload.responseJSON { 
                    response in
                    print(response.request)  //original URL request
                    print(response.response) //URL response
                    print(response.data)     //server data
                    print(response.result)   //result of response serialization
    
                    if let JSON = response.result.value {
                        print("JSON: \(JSON)")
                    }
                }
            case .Failure(let encodingError):
                print(encodingError)
            }
        })
    }
    • Esto me da el código de estado 415
    • HTTP Error 415 Unsupported media type plz comprobar el tipo de imagen @chamathjeevan
    • Si hay una clave de «imagen» en el siguiente parámetro [«género»:el género,»nombre»:nombre,»fecha de nacimiento»:fecha de nacimiento,»aboutme»:aboutme,»token»:token,»apellidos»:apellido, «imagen»: imageData], a continuación, multipartFormData.appendBodyPart(datos: imageData, nombre: «imagen», nombre de archivo: «archivo.png», mimeType: «image/png») se anexará en los parámetros?
    • Espero que usted consiguió mi pregunta anterior
    • oh hombre, editar el código. Esto es un desastre para leer.
    • Funciona muy bien, una pregunta Si puedo tomar una foto de la cámara y la interpretan UIImagePNGRepresentation función en UIImage, ¿cómo puedo conservar la orientación?
    • No es trabajo de swift 3 incluso cuando se cambia la sintaxis de c/swift 3
    • aquí está mi código paste.ubuntu.com/23973651
    • el código me funciona gracias
    • [email protected] Tiwari

  2. 4

    SWIFT 2 AlamoFire Simple para Cargar la Imagen (REST API)

    @amit gupta parece Que la respuesta contiene gran sobrecarga. AlamoFire contener la carga de solución simplificada. Alamofire.método de solicitud contiene varios simplificado de sobrecarga que puede utilizar para cargar de manera sencilla. Mediante el uso de Alamofire.solicitud( método desarrollador puede deshacerse de la codificación de la sobrecarga.

    De Estado HTTP 415 da porque de no especificar el tipo de medio correcto.

    Por favor revise mi solución a continuación.

    import UIKit
    import Alamofire
    
    class ViewController: UIViewController {
    
        @IBOutlet var imageView: UIImageView!
        @IBOutlet var btnUpload: UIButton!
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        func successDataHandler(responseData:String){
    
            print ("IMAGE UPLOAD SUCCESSFUL    !!!")
    
        }
    
        func failureDataHandler(errorData:String){
    
            print ("  !!!   IMAGE UPLOAD FAILURE   !!! ")
    
        }
    
        @IBAction func actionUpload(sender: AnyObject) {
    
            let URL = "http://m8coreapibeta.azurewebsites.net/api/cards/SaveImages"
    
            let postDataProlife:[String:AnyObject] = ["CardId":(dataCardDetail?.userId)!,"ImageType":1,"ImageData":imageView.image!]
    
            uplaodImageData(URL, postData: postDataProlife, successHandler: successDataHandler, failureHandler: failureDataHandler)
        }
    
        func uplaodImageData(RequestURL: String,postData:[String:AnyObject]?,successHandler: (String) -> (),failureHandler: (String) -> ()) -> () {
    
            let headerData:[String : String] = ["Content-Type":"application/json"]
    
            Alamofire.request(.POST,RequestURL, parameters: postData, encoding: .URLEncodedInURL, headers: headerData).responseString{ response in
                switch response.result {
                case .Success:
                    print(response.response?.statusCode)
                    successHandler(response.result.value!)
                case .Failure(let error):
                    failureHandler("\(error)")
                }
            }
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            //Dispose of any resources that can be recreated.
        }
    
    
    }
  3. 3

    Almaofire con swift 3.0

    Alamofire.upload(multipartFormData: { multipartFormData in
        var index = 1
        for image in imageArray {
            let imageData: Data = (UIImageJPEGRepresentation(image, 1.0) as Data?)!
    
            multipartFormData.append(imageData, withName: "home-\(index)", fileName: "home-\(index)", mimeType: "image/jpeg")
    
            index += 1
        }
        }, with: requestName, encodingCompletion: { result in
            switch result {
            case .success(let upload, _, _):
    
                upload.responseJSON { response in
                    print("Image(s) Uploaded successfully:\(response)")
                }
            case .failure(let encodingError):
                print("encodingError:\(encodingError)")
            }
    })
    • mi problema es que las imágenes de nombres y directorios de cómo lograr imágenes en la galería de los directorios y sus nombres?
  4. 2

    Swift 4 con Alamofire 4

    let isConnected = connectivity.isConnectedToInternet()
    
      func updateProfile(firstName:String,lastName:String ,imageData:Data?,completion: @escaping (isValidUser)->()) {
    
    
        if self.isConnected {
    
            var parameters : [String:String] = [:]
            parameters["auth_key"] = loginUser?.authKey!
            parameters["User[first_name]"] = firstName
            parameters["User[last_name]"] = lastName
    
            let url = "\(baseUrl)\(basicAuthenticationUrl.updateProfile)"
            print(url)
    
    
            Alamofire.upload(multipartFormData: { (multipartFormData) in
                for (key, value) in parameters {
                    multipartFormData.append("\(value)".data(using: String.Encoding.utf8)!, withName: key as String)
                }
    
                if let data = imageData {
                    multipartFormData.append(data, withName: "image_url", fileName: "image.png", mimeType: "image/png")
                }
    
            }, usingThreshold: UInt64.init(), to: url, method: .post) { (result) in
                switch result{
                case .success(let upload, _, _):
                    upload.responseJSON { response in
                        print("Succesfully uploaded  = \(response)")
                        if let err = response.error{
    
                            print(err)
                            return
                        }
    
                    }
                case .failure(let error):
                    print("Error in upload: \(error.localizedDescription)")
    
                }
            }
        }
    
    }
  5. 0

    Almaofire con swift 2.0 sólo copiar y pegar a continuación el código.aquí m asumming JSON de respuesta desde el servidor

     func uploadImageRemote (imageData : NSData?) -> Dictionary <String,AnyObject>{
        var imageDictionary = Dictionary<String,AnyObject>()
    
          var tokenHeaders:[String:String]! = ["x-access-token":Constants.kUserDefaults.stringForKey("userToken")!]
        Alamofire.upload(
            .POST,
            "http://52.26.230.146:3300/api/profiles/imageUpload",headers:tokenHeaders,
            multipartFormData: { multipartFormData in
                multipartFormData.appendBodyPart(data: imageData!, name: "upload", fileName: "imageFileName.jpg", mimeType: "image/jpeg")
            },
            encodingCompletion: { encodingResult in
                switch encodingResult {
                case .Success(let upload, _, _):
                    upload.progress { (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in
                        print("Uploading Avatar \(totalBytesWritten) /\(totalBytesExpectedToWrite)")
                        dispatch_async(dispatch_get_main_queue(),{
    
                        })
                    }
                    upload.responseJSON { response in
                        guard response.result.error == nil else {
                            print("error calling GET \(response.result.error!)")
                            return
                        }
    
                        if let value = response.result.value {
                           print("Success JSON is:\(value)")
                            if let result = value as? Dictionary<String, AnyObject> {
                                imageDictionary["imageUrl"] = result["url"]
                            }
                        }
    
                        dispatch_async(dispatch_get_main_queue(),{
                            //Show Alert in UI
                            print("Avatar uploaded");
                        })
                    }
    
                case .Failure(let encodingError):
                    //Show Alert in UI
                    print("Avatar not uploaded \(encodingError)");
                }
            }
        );
    
    
    
    return imageDictionary
    }
  6. -2

    El uso de los Parámetros de codificación, hacer un ParameterEncoding variable, asignar un tipo de codificación (el caso de la enumeración que se incluyen .JSON .URL) y, a continuación, utilizar la codificación de la función con su NSURLRequest y los parámetros. Esta función devuelve una tupla de dos elementos, el primero es el resultante NSURLRequest y el segundo, el que resulta posible NSError.

    He aquí cómo yo lo he utilizado para un encabezado personalizado que yo necesitaba en un proyecto

     var parameterEncoding:ParameterEncoding!
        switch method {
            case .POST, .PUT :
                parameterEncoding = ParameterEncoding.JSON
            default :
                parameterEncoding = ParameterEncoding.URL
        }
        var alamoRequest = Alamofire.Manager.sharedInstance.request(parameterEncoding.encode(mutableURLRequest, parameters: parameters).0)

Dejar respuesta

Please enter your comment!
Please enter your name here