8

Right now I've been uploading only one image to a server on a server side script through the code given below. Now I have an array of UIImage, I want to know how can I use UIImageJPEGRepresentation(myImageView.image!, 0.1) to post all the images in a UIImageView array?

func uploadImage()
{
    let postPictureUrl = NSURL(string: "http://www.23look.com/merchant/verify")
    let request = NSMutableURLRequest(URL: postPictureUrl!)
    request.HTTPMethod="POST"

    let param=[
        "mer_name" : shopNameUITF.text!,
        "mer_tel" : shopTelephoneUITF.text!,
        "mer_address" : shopAddressUITF.text!,
        "lat" : "39.6892",
        "lng" : "115.9239",
        "token": KeychainWrapper.stringForKey("tokenValue")!,
        "mer_type": "smalll"
    ]

    let abc =  KeychainWrapper.stringForKey("tokenValue")!

    let boundary = generateBoundaryString()

    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

    let imageData = UIImageJPEGRepresentation(myImageView.image!, 0.1)

    if imageData==nil { print("image data is nil"); return }

    request.HTTPBody = createBodyWithParameters(param, filePathKey: "mer_license", imageDataKey: imageData!, boundary: boundary)

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
        data, response, error in

        if error != nil {
            print("error=\(error)")
            return
        }

        //You can print out response object
        print("***** response = \(response)")

        // Print out reponse body
        let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
        print("**** response data = \(responseString!)")

        do {

            let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary

            dispatch_async(dispatch_get_main_queue(), {
                print(NSString(data: data!, encoding:NSUTF8StringEncoding)!)
                print(json)
            })

        } catch let err {
            print(err)
        }
    }
    task.resume()
}

func generateBoundaryString() -> String {
    return "Boundary-\(NSUUID().UUIDString)"
}

func createBodyWithParameters(parameters:[String:String]?, filePathKey: String?, imageDataKey:NSData, boundary: String) -> NSData {

    var 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 = "user-profile.jpg"
    let mimetype = "image/jpg"

    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.appendData(imageDataKey)
    body.appendString("\r\n")

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

    return body
}

It takes following parameters:

mer_name - String

mer_tel - String

mer_address - string

lng - string

lat - string

mer_licence - file type (This is where my images will be uploaded)

token - string

mer_type - string

Jagat Dave
  • 1,643
  • 3
  • 23
  • 30
laser2302
  • 427
  • 2
  • 7
  • 19
  • Which kind of parameter could your server receive?1.One data without name2.Many data with different name3.An array of data. – Lumialxk Jan 28 '16 at 03:49
  • Many data with different names: mer_name (String), mer_tel (String), mer_address (String), long (string), lat (string), mer_licence (file type), token (string), mer_type (string) – laser2302 Jan 28 '16 at 03:56
  • what is "token": KeychainWrapper.stringForKey("tokenValue")!, here? and what is the field for the images? – Gorib Developer Jun 05 '18 at 07:11

2 Answers2

21

You should do changes in createBodyWithParameters like below.........

When you have multiple images...

  func createBodyWithParameters(parameters: NSMutableDictionary?,boundary: String) -> NSData {
    let body = NSMutableData()

    if parameters != nil {
        for (key, value) in parameters! {

            if(value is String || value is NSString){
                body.appendString("--\(boundary)\r\n")
                body.appendString("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
                body.appendString("\(value)\r\n")
            }
            else if(value is [UIImage]){
                var i = 0;
                for image in value as! [UIImage]{
                    let filename = "image\(i).jpg"
                    let data = UIImageJPEGRepresentation(image,1);
                    let mimetype = mimeTypeForPath(filename)

                    body.appendString("--\(boundary)\r\n")
                    body.appendString("Content-Disposition: form-data; name=\"\(key)\"; filename=\"\(filename)\"\r\n")
                    body.appendString("Content-Type: \(mimetype)\r\n\r\n")
                    body.appendData(data!)
                    body.appendString("\r\n")
                    i++;
                }


            }
        }
    }
    body.appendString("--\(boundary)--\r\n")
    //        NSLog("data %@",NSString(data: body, encoding: NSUTF8StringEncoding)!);
    return body
}

func generateBoundaryString() -> String {
    return "Boundary-\(NSUUID().UUIDString)"

}

func mimeTypeForPath(path: String) -> String {
    let pathExtension = path.pathExtension
    var stringMimeType = "application/octet-stream";
    if let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension!, nil)?.takeRetainedValue() {
        if let mimetype = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType)?.takeRetainedValue() {
            stringMimeType = mimetype as NSString as String
        }
    }
    return stringMimeType;
}



func createRequest (param : NSMutableDictionary , strURL : String) -> NSURLRequest {

    let boundary = generateBoundaryString()

    let url = NSURL(string: strURL)
    let request = NSMutableURLRequest(URL: url!)

    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
    request.HTTPMethod = "POST"
    request.HTTPBody = createBodyWithParameters(param, boundary: boundary)

    return request
}
Bhoomi Jagani
  • 2,413
  • 18
  • 24
  • Thanks! But I have an array of images, i.e. var licenseImages = [UIImage](). My images are stored in this array, how can I get the images from this array and post them along with other string parameters? – laser2302 Jan 28 '16 at 06:06
  • I tried, but it says "Thanks for the feedback! Once you earn a total of 15 reputation, your votes will change the publicly displayed post score." Once I get 15 reputation I'll come back and see if I can up vote your answer. I'm quite new to this. – laser2302 Jan 29 '16 at 13:46
  • @Bhoomi HI, I am doing the same but I am getting error in response. Can you please check? http://stackoverflow.com/questions/37292632/swift-upload-multiple-images-to-server – Karanveer Singh May 18 '16 at 09:43
  • Hi Bhoomi,I am also facing same issue in objective-c. Can you please send me same code in objective-c –  Sep 01 '16 at 06:42
  • @Bhoomi is it possible to post array of images to server, that means can we send more than one images under same name? – Akhil Clement Sep 27 '16 at 17:39
  • @AkhilClement yes above code to upload multiple images in array.In above code you have to just pass array of image.All image converted to data and appended with previous data.So we can send images together from array of images. – Bhoomi Jagani Sep 28 '16 at 11:16
  • Hi @Bhoomi I find your answer very interesting and I am looking for something similar, if you could spare some time to check my question out I would be very grateful! http://stackoverflow.com/questions/40527140/mysql-and-swift-upload-image-would-it-be-better-to-use-afnetworking There's also 50 rep bounty ;) –  Nov 20 '16 at 23:58
  • @BhoomiJagani This is for multiple image upload with multiple body name ......? If it is same can you please refer in objective c – Raviteja Mathangi May 08 '19 at 15:19
0
    doOnMain {
        Loading.sharedInstance.startloading()
    }
    let url = NSURL(string:"URL")
    let request = NSMutableURLRequest(url: url! as URL)
    request.httpMethod = "POST"
    let headers = ["Accept-Language": "en"]
    request.allHTTPHeaderFields = headers
    let boundary = generateBoundaryString()
    //define the multipart request type
    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

    if (imgRefund.image == nil){
        return
    }

    // First Image
    let image_data = imgRefund.image!.pngData()
    if(image_data == nil){
        return
    }

    // Second Image

    let image_data1 = imgRefund1.image!.pngData()
    if(image_data1 == nil){
        return
    }

    let body = NSMutableData()
    let fname = "filename"
    let fname1 = "filename1"
    let mimetype = "image/png"

    let parameters = ["key":"value","key":"value"]
    if parameters != nil {
        for (key, value) in parameters {
            body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
            body.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n".data(using: String.Encoding.utf8)!)
            body.append("\(value)\r\n".data(using: String.Encoding.utf8)!)
        }
    }

    // First Image

    body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
    body.append("Content-Disposition:form-data; name=\"test\"\r\n\r\n".data(using: String.Encoding.utf8)!)
    body.append("hi\r\n".data(using: String.Encoding.utf8)!)
    body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
    body.append("Content-Disposition:form-data; name=\"parameter\"; filename=\"\(fname)\"\r\n".data(using: String.Encoding.utf8)!) // paramenter name
    body.append("Content-Type: \(mimetype)\r\n\r\n".data(using: String.Encoding.utf8)!)
    body.append(image_data!)
    body.append("\r\n".data(using: String.Encoding.utf8)!)
    body.append("--\(boundary)--\r\n".data(using: String.Encoding.utf8)!)


    // Second Image
    body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
    body.append("Content-Disposition:form-data; name=\"test\"\r\n\r\n".data(using: String.Encoding.utf8)!)
    body.append("hi\r\n".data(using: String.Encoding.utf8)!)
    body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
    body.append("Content-Disposition:form-data; name=\"parameter1\"; filename=\"\(fname1)\"\r\n".data(using: String.Encoding.utf8)!) // paramenter name 1
    body.append("Content-Type: \(mimetype)\r\n\r\n".data(using: String.Encoding.utf8)!)
    body.append(image_data1!)
    body.append("\r\n".data(using: String.Encoding.utf8)!)
    body.append("--\(boundary)--\r\n".data(using: String.Encoding.utf8)!)





    request.httpBody = body as Data

    let session = URLSession.shared
    let task = session.dataTask(with: request as URLRequest) {
        (
        data, response, error) in
        guard let _:NSData = data! as NSData, let _:URLResponse = response, error == nil else {
            print("error")
            return
        }
        let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
        print("****** response data = \(responseString!)")
        do {
            let json = try JSONSerialization.jsonObject(with: data!, options: []) as? NSDictionary
            print("****** response json = \(json!)")

            if(json?.value(forKey: "status") as! Int == 200){
                print(json)
            }
            else{

            }
        }catch{
            print(error)
        }
    }
    task.resume()

 func generateBoundaryString() -> String {
    return "Boundary-\(NSUUID().uuidString)"
}
shan
  • 136
  • 7