Subir varias imágenes a la rápida utilizando Alamofire

Estoy usando el siguiente código para cargar una sola imagen a un servidor:

private static func urlRequestWithComponents(urlString:String, parameters:Dictionary<String, String>, imageData:NSData?, imageName: String) -> (URLRequestConvertible , NSData) {

    //create url request to send
    let mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: urlString)!)
    mutableURLRequest.HTTPMethod = Alamofire.Method.POST.rawValue
    let boundaryConstant = "myRandomBoundary12345";
    let contentType = "multipart/form-data;boundary="+boundaryConstant
    mutableURLRequest.setValue(contentType, forHTTPHeaderField: "Content-Type")


    //create upload data to send
    let uploadData = NSMutableData()
    if(imageData != nil && imageData?.length != 0) {
        //add image
        uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        uploadData.appendData("Content-Disposition: form-data; name=\"\(imageName)\"; filename=\"\(StringHelper.sharedInstance.randomString(5)).png\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        uploadData.appendData("Content-Type: image/png\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        uploadData.appendData(imageData!)
    }
    //add parameters
    for (key, value) in parameters {
        uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        uploadData.appendData("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n\(value)".dataUsingEncoding(NSUTF8StringEncoding)!)
    }
    uploadData.appendData("\r\n--\(boundaryConstant)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
    print("upload",parameters)
    //return URLRequestConvertible and NSData
    return (Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: nil).0, uploadData)
}

¿Cómo puedo subir varias imágenes en un único parámetro mediante la edición de este código?

¿cómo se puede cargar varias imágenes de la matriz en una sola pararmeter
Usted puede hacer una estructura que toma todos sus func params, a continuación, crear una función que toma un array de esas estructuras, a continuación, en la función que puede iterar a través de la matriz y, a continuación, devolver una matriz de solicitudes. Si usted quiere hacer todo a la vez porque lo que necesita hacer algo cuando todas las cargas están terminados, buscar en la Operación de la cola o Grupo de Despacho
Por favor, consulte el enlace stackoverflow.com/questions/28448837/…, stackoverflow.com/questions/40527140/…

OriginalEl autor Arun sharma | 2017-01-06

4 Kommentare

  1. 34

    Swift 3
    Sólo uso «[]» con cargar la imagen param para hacer despliegue de imágenes.

    Alamofire.upload(multipartFormData: { multipartFormData in
                //import image to request
                for imageData in imagesData {
                    multipartFormData.append(imageData, withName: "\(imageParamName)[]", fileName: "\(Date().timeIntervalSince1970).jpeg", mimeType: "image/jpeg")
                }
                for (key, value) in parameters {
                    multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)
                }
            }, to: urlString,
    
                encodingCompletion: { encodingResult in
                    switch encodingResult {
                    case .success(let upload, _, _):
                        upload.responseJSON { response in
    
                        }
                    case .failure(let error):
                        print(error)
                    }
    
            })
    Corto y simple para subir múltiples imágenes , Gracias
    ¿Puede por favor explicar el anterior fragmento de código?
    El código de arriba es para subir múltiples imágenes de la colección, de acuerdo con el código de Datos de imágenes (de la Fundación.De datos) en imagesData matriz. el problema fue que se primordial de la imagen anterior, el valor de los datos a la hora de crear mutipartFormData mediante la iteración. Pero anexando [ ] corchetes al final de la param name es capaz de cargar los datos en la matriz. Eso es todo. Lo mismo se puede ver en el cartero de la aplicación para cargar la matriz de imágenes. Gracias. Por favor upvote si su ok.
    Puedes por favor decirme lo que aname: «(imageParamName)[]» en el código anterior??
    aname es el param aceptar el nombre de clave de los medios de comunicación de datos, como el valor enviado en ‘imageParamName’ variable, el uso de corchetes ‘[ ]’ es identificar que este parámetro contiene la matriz de valores.

    OriginalEl autor Gurjit Singh

  2. 4

    Este me ayuda:

    private func urlRequestWithComponentsForUploadMultipleImages(urlString:String, parameters:Dictionary<String, String>, imagesData:[Data], imageName: String) -> (URLRequestConvertible , Data) {
    
        //create url request to send
        var mutableURLRequest = URLRequest(url: NSURL(string: urlString)! as URL)
    
        mutableURLRequest.httpMethod = Alamofire.HTTPMethod.post.rawValue
        let boundaryConstant = "myRandomBoundary12345";
        let contentType = "multipart/form-data;boundary="+boundaryConstant
        mutableURLRequest.setValue(contentType, forHTTPHeaderField: "Content-Type")
    
    
        //create upload data to send
        var uploadData = Data()
        //add image
        for data in imagesData {
            uploadData.append("\r\n--\(boundaryConstant)\r\n".data(using: String.Encoding.utf8)!)
            uploadData.append("Content-Disposition: form-data; name=\"\(imageName)\"; filename=\"\(Date().timeIntervalSince1970).jpeg\"\r\n".data(using: String.Encoding.utf8)!)
            uploadData.append("Content-Type: image/jpeg\r\n\r\n".data(using: String.Encoding.utf8)!)
            uploadData.append(data)
        }
        //add parameters
        for (key, value) in parameters {
            uploadData.append("\r\n--\(boundaryConstant)\r\n".data(using: String.Encoding.utf8)!)
            uploadData.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n\(value)".data(using: String.Encoding.utf8)!)
        }
        uploadData.append("\r\n--\(boundaryConstant)--\r\n".data(using: String.Encoding.utf8)!)
        print("upload",parameters)
        return (mutableURLRequest , uploadData)
    }

    OriginalEl autor Arun sharma

  3. 2

    Parece que esta pregunta ya fue respondida en la, ASÍ que, probablemente en varios lugares. Aquí está un enlace que he encontrado:

    Cómo subir múltiples imágenes en varias partes, utilizando Alamofire?

    Voy a pegar su solución para la comodidad, pero se dijo que trabaja para Swift 3.x:

    //MARK: - upload multiple photos
    
    func uploadImagesAndData(params:[String : AnyObject]?,image1: UIImage,image2: UIImage,image3: UIImage,image4: UIImage,headers : [String : String]?, completionHandler:@escaping CompletionHandler) -> Void {
    
        let imageData1 = UIImageJPEGRepresentation(image1, 0.5)!
        let imageData2 = UIImageJPEGRepresentation(image2, 0.5)!
    
        let imageData3 = UIImageJPEGRepresentation(image3, 0.5)!
    
        let imageData4 = UIImageJPEGRepresentation(image4, 0.5)!
    
    
        Alamofire.upload(multipartFormData: { multipartFormData in
    
                for (key, value) in params! {
                    if let data = value.data(using: String.Encoding.utf8.rawValue) {
                        multipartFormData.append(data, withName: key)
                    }
                }
    
                multipartFormData.append(imageData1, withName: "file", fileName: "image.jpg", mimeType: "image/jpeg")
                multipartFormData.append(imageData2, withName: "file", fileName: "image.jpg", mimeType: "image/jpeg")
                multipartFormData.append(imageData3, withName: "file", fileName: "image.jpg", mimeType: "image/jpeg")
                multipartFormData.append(imageData4, withName: "file", fileName: "image.jpg", mimeType: "image/jpeg")
    
        },
            to: K_BASEURL + K_API_LOGINDATA, encodingCompletion: { encodingResult in
                switch encodingResult {
                case .success(let upload, _, _):
                    upload
                        .validate()
                        .responseJSON { response in
                            switch response.result {
                            case .success(let value):
                                print("responseObject: \(value)")
                            case .failure(let responseError):
                                print("responseError: \(responseError)")
                            }
                    }
                case .failure(let encodingError):
                    print("encodingError: \(encodingError)")
                }
        })

    La solución parece estar basada en el enfoque recomendado detallada en el Alamofire documentación aquí: https://github.com/Alamofire/Alamofire#uploading-multipartformdata

    Alamofire.upload(
    multipartFormData: { multipartFormData in
        multipartFormData.append(unicornImageURL, withName: "unicorn")
        multipartFormData.append(rainbowImageURL, withName: "rainbow")
    },
    to: "https://httpbin.org/post",
    encodingCompletion: { encodingResult in
        switch encodingResult {
        case .success(let upload, _, _):
            upload.responseJSON { response in
                debugPrint(response)
            }
        case .failure(let encodingError):
            print(encodingError)
        }
    })

    OriginalEl autor Lobsterman

  4. 1

    aquí está mi solución y que funcione al 100% sin bugs..

            Alamofire.upload(multipartFormData: { (multipartFormData : MultipartFormData) in
    
                let count = imageToUpload.count
    
                for i in 0..<count{
                    multipartFormData.append(imageToUpload[i], withName: "morephoto[\(i)]", fileName: "photo\(i).jpeg" , mimeType: "image/jpeg")
    
                }
                for (key, value) in parameterrs {
    
                        multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key)
                }
                print(multipartFormData)
            }, to: url!) { (result) in
    
                    switch result {
                    case .success(let upload, _ , _):
    
                        upload.uploadProgress(closure: { (progress) in
    
                            print("uploding: \(progress.fractionCompleted)")
                        })
    
                        upload.responseJSON { response in
    
                        print(response.result.value!)
                        let resp = response.result.value! as! NSDictionary
                        if resp["status"] as! String == "success"{
                            print(response.result.value!)
                            let alert = UIAlertController(title: "Alert", message: "Image Upload Successful", preferredStyle: UIAlertControllerStyle.alert)
                            alert.addAction(UIAlertAction(title: "Okay", style: UIAlertActionStyle.default, handler: nil))
                            self.present(alert, animated: true, completion: nil)
    
    
                        }
                        else{
    
                        }
    
    
                    }
    
                case .failure(let encodingError):
                    print("failed")
                    print(encodingError)
    
                }
            }

    en este imagetoupload matriz es la matriz de los datos de la imagen que he hecho antes.

    OriginalEl autor ayush pathak

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea