1

Checkout the code for single image upload but not able to upload the multiple images in an array under same key.

IN BELOW CODE , It is working perfect when I am sending one image to the server. -> I want to find answer for the multiple images in array without using alamofire or other third party library.

      func imageUploadRequest(IMAGE_ARRAY: [UIImage] , uploadUrl: NSURL) {

        myloader.showLoader(controller: self)
      let param = ["title":"ds","category_id":"5","description":"gdfjghjdsfgksd","user_id":"66","color":"red"]

        let request = NSMutableURLRequest(url:uploadUrl as URL)
        request.httpMethod = "POST"
        let boundary = generateBoundaryString()
        request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

        //let imageData = UIImageJPEGRepresentation(imageView.imageOrientation, 0.1)
        for item in IMAGE_ARRAY
        {
            let imageData = item.jpegData(compressionQuality: 0.01)
            if(imageData==nil)  { return; }

            request.httpBody = createBodyWithParameters(parameters: param as [String : Any], filePathKey: "files[]", cv : imageData! as NSData, boundary: boundary) as Data
        }

        // myActivityIndicator.startAnimating();

        let task =  URLSession.shared.dataTask(with: request as URLRequest,
                                               completionHandler: {
                                                (data, response, error) -> Void in
                                                if let data = data {
                                                    DispatchQueue.main.async { // Update UI
                                                        self.myloader.removeLoader(controller: self)
                                                        let decoder = JSONDecoder()

                                                        let obj = try! decoder.decode(GetResponse_Otp.self, from: data)


                                                    }
                                                }
        })
        task.resume()
    }

    func createBodyWithParameters(parameters: [String: Any]?, filePathKey: String?, cv: NSData, boundary: String) -> NSData {
        let body = NSMutableData();

        if parameters != nil {
            for (key, value) in parameters! {
                body.appendString("--\(boundary)\r\n")
                body.appendString("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
                body.appendString("\(value)\r\n")
            }
        }

        let filename = "\(Date().timeIntervalSince1970).jpeg"
        let mimetype = "image/png"

        body.appendString("--\(boundary)\r\n")
        body.appendString("Content-Disposition: form-data; name=\"\(filePathKey!)\"; filename=\"\(filename)\"\r\n")
        body.appendString("Content-Type: \(mimetype)\r\n\r\n")
        body.append(cv as Data)
        body.appendString("\r\n")

        body.appendString("--\(boundary)--\r\n")

        return body
    }

    func generateBoundaryString() -> String {
        return "Boundary-\(NSUUID().uuidString)"
    }
    // extension for impage uploading
}
Ankur Purwar
  • 275
  • 2
  • 9
  • please try : https://stackoverflow.com/questions/35052469/uploading-multiple-images-with-other-parameters-in-swift – Rohit Makwana Nov 06 '19 at 06:56
  • Read the question again , I am asking how to upload multiple images in a array under a same key name in swift 4 without using Alamofire – Ankur Purwar Nov 06 '19 at 07:02

2 Answers2

1

You need to change your key name to KEY_NAME[] add array [] in your key and make sure every time the file name is different or you can try this too:

(Date().timeIntervalSince1970).jpeg

to make sure that the name is different everytime.

0
func imageUploadRequest(ARRAY_OF_IMAGES: [ANY] , uploadUrl: NSURL) {

     myloader.showLoader(controller: self)
     let param = ["user_id":fetchString(key: "userId"), "career_level":UnwarppingValue(value: btnCarrer.title(for: .normal)),"education":UnwarppingValue(value: btnEducation.title(for: .normal)),"cur_location":txtFldLocation.text!,"cur_position":txtFldCurrentPosition.text!,"cur_employee":txtFldCurrentEmployee.text!,"experience": UnwarppingValue(value: btnExperience.title(for: .normal)),"industry":UnwarppingValue(value: btnIndustry.title(for: .normal))] as [String : Any]

     let request = NSMutableURLRequest(url:uploadUrl as URL)
     request.httpMethod = "POST"
     let boundary = generateBoundaryString()
     request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

     //let imageData = UIImageJPEGRepresentation(imageView.imageOrientation, 0.1)
     for item in IMAGE_ARRAY
     {
     let imageData = item.jpegData(compressionQuality: 0.01)
     if(imageData==nil)  { return; }

     request.httpBody = createBodyWithParameters(parameters: param as [String : Any], filePathKey: "KEY_NAME[]", cv : imageData! as NSData, boundary: boundary) as Data
     }

     // myActivityIndicator.startAnimating();

     let task =  URLSession.shared.dataTask(with: request as URLRequest,
                                               completionHandler: {
                                                (data, response, error) -> Void in
             if let data = data {
                DispatchQueue.main.async { // Update UI
                     self.myloader.removeLoader(controller: self)
                     let decoder = JSONDecoder()

                     let obj = try! decoder.decode(GetResponse_ProfileOverViewDetails.self, from: data)

                     guard obj.response?.result == "1" else{
                        showToast(message: obj.response?.msg ?? "Something Went Wrong", vc: self, normalColor: false)
                        return
                     }

                     if let userPic = obj.response?.data?[0].pic {
                           saveStringInDefault(value: userPic, key: "userPic")
                     }else {
                         saveStringInDefault(value: "", key: "userPic")
                     }
                  showToast(message: obj.response?.msg ?? "Something Went Wrong", vc: self, normalColor: false)
             }
         }
       })task.resume()
    }

    func createBodyWithParameters(parameters: [String: Any]?, filePathKey: String?, cv: NSData, boundary: String) -> NSData {
        let body = NSMutableData();

        if parameters != nil {
            for (key, value) in parameters! {
                body.appendString(string: "--\(boundary)\r\n")
                body.appendString(string: "Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
                body.appendString(string: "\(value)\r\n")
            }
        }

        let filename = HERE->(Date().timeIntervalSince1970).jpeg
        let mimetype = "image/png"

        body.appendString(string: "--\(boundary)\r\n")
        body.appendString(string: "Content-Disposition: form-data; name=\"\(filePathKey!)\"; filename=\"\(filename)\"\r\n")
        body.appendString(string: "Content-Type: \(mimetype)\r\n\r\n")
        body.append(cv as Data)
        body.appendString(string: "\r\n")

        body.appendString(string: "--\(boundary)--\r\n")

        return body
    }

    func generateBoundaryString() -> String {
        return "Boundary-\(NSUUID().uuidString)"
    }
    // extension for impage uploading
}

Check i edit the code in caps.

Vineesh TP
  • 7,755
  • 12
  • 66
  • 130
  • This error occurs brother :- 2019-11-07 15:13:20.761172+0530 wows[5938:150457] Fatal error: 'try!' expression unexpectedly raised an error: Swift.DecodingError.dataCorrupted(Swift.DecodingError.Context(codingPath: [], debugDescription: "The given data was not valid JSON.", underlyingError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 "Garbage at end." UserInfo={NSDebugDescription=Garbage at end.}))): file /Users/rahulrai/Desktop/wows/wows/Controller/AddProductVC.swift, line 212 – Ankur Purwar Nov 07 '19 at 09:44
  • Change this `let filename = "\(Date().timeIntervalSince1970).jpeg"` to your specific images name which should be different and change the mimeType to `mimeType: "image/jpeg"` – Munzareen Atique Nov 07 '19 at 10:35
  • Brother It clearly shows that issue regarding json and if you want api the I will let you know – Ankur Purwar Nov 07 '19 at 11:08
  • Send me api link and parameters i will apply it here – Munzareen Atique Nov 07 '19 at 13:27
  • Brother only on image is uploading on the server , tell me your what's app , I will share. a api and other details – Ankur Purwar Nov 08 '19 at 05:52