2016-01-28 13 views
7

Im Moment habe ich nur ein Bild auf einen Server auf einem Server-Side-Skript hochgeladen durch den unten angegebenen Code. Jetzt habe ich ein Array von UIImage, ich möchte wissen, wie kann ich UIImageJPEGRepresentation(myImageView.image!, 0.1) verwenden, um alle Bilder in einem UIImageView Array zu posten?Hochladen von mehreren Bildern mit anderen Parametern in Swift

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 
} 

Es nimmt folgende Parameter:

mer_name - String

mer_tel - String

mer_address - String

lng - String

lat - String

mer_licence - Dateityp (Dies ist, wo meine Bilder hochgeladen werden)

Token - String

mer_type - String

+0

Welche Art von Parameter könnte Ihr Server erhalten? 1.One Daten ohne name2.Viele Daten mit unterschiedlichem Namen3. Ein Array von Daten. – Lumialxk

+0

Viele Daten mit unterschiedlichen Namen: mer_name (String), mer_tel (String), mer_address (String), long (string), lat (string), mer_licence (Dateityp), token (string), mer_type (string) – laser2302

Antwort

13

Sie sollten wie unten in createBodyWithParameters Änderungen tun ....... ..

Wenn Sie mehrere Bilder haben ...

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 
} 
+0

Vielen Dank! Aber ich habe ein Array von Bildern, d. H. Var licenseImages = [UIImage](). Meine Bilder werden in diesem Array gespeichert. Wie kann ich die Bilder von diesem Array abrufen und zusammen mit anderen String-Parametern veröffentlichen? – laser2302

+0

Ich habe versucht, aber es sagt "Danke für die Rückmeldung! Sobald Sie insgesamt 15 Ruf verdienen, werden Ihre Stimmen die öffentlich angezeigte Post-Punktzahl ändern." Sobald ich 15 Reputation bekomme, werde ich zurückkommen und sehen, ob ich deine Antwort abstimmen kann. Ich bin ziemlich neu dazu. – laser2302

+0

@Bhoomi HI, ich mache das gleiche, aber ich bekomme einen Fehler in der Antwort. Können Sie es bitte überprüfen? http://stackoverflow.com/questions/37292632/swift-upload-multiple-images-to-server –

Verwandte Themen