2016-01-28 8 views
7

今は、以下のコードを使用してサーバーサイドスクリプトのサーバーに1つの画像しかアップロードしていません。今私はUIImageの配列を持っています、UIImageJPEGRepresentation(myImageView.image!, 0.1)を使用してUIImageViewの配列のすべての画像を投稿する方法を知りたいですか?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 
} 

それは、次のパラメータを取ります。

mer_name - 文字列

mer_tel - 文字列

mer_address - 文字列

LNG - 文字列

緯度 - 文字列

mer_licence - ファイルタイプ(私の画像がアップロードされる場所です)

トークン - 文字列

mer_type - あなたは以下のようなcreateBodyWithParametersの変更を行う必要があり、文字列

+0

どのパラメータの種類、サーバーが受け取るだろうか?1.Oneデータ名前なし。名前の異なる多くのデータ。データの配列。 – Lumialxk

+0

mer_name(文字列)、mer_tel(文字列)、mer_address(文字列)、long(文字列)、lat(文字列)、mer_licence(ファイルタイプ)、token(文字列)、mer_type(文字列) – laser2302

答えて

13

....... ..

あなたが複数のイメージを持っている場合...

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

ありがとう!しかし、私は画像の配列、すなわちvar licenseImages = [UIImage]()を持っています。私のイメージはこの配列に格納されていますが、この配列からイメージを取得して、他の文字列パラメータと共にそれらをポストする方法はありますか? – laser2302

+0

私は試してみましたが、「フィードバックいただきありがとうございます!一度合計15の評判をいただければ、あなたの票は公開されたポストスコアを変更します」一度私が15の評判を得ると、私はあなたの答えを投票できるかどうかを見て戻ってきます。私はこれにはかなり新しいです。 – laser2302

+0

@Bhoomi HI、私も同じことをやっていますが、私は応答が間違っています。確認していただけますか? http://stackoverflow.com/questions/37292632/swift-upload-multiple-images-to-server –

関連する問題