转移到服务器

时间:2016-05-04 17:21:37

标签: ios swift uiimage nsurlconnection nsurlsession

将UIImage编码为Base64字符串在设备上工作,但是将字符串传输到服务器会以某种方式破坏字符串并阻止服务器成功解码图像。

有关此问题的任何建议吗?

        // Define params
        params["thumbnail_base64"] = imageToBase64(blockSet.thumbnailURL)
        ...

        // Convert params -> query string
        let postString = buildQueryString(params)

        // Define upload URL
        let uploadURL = NSURL(string: RootURL + UploadFilePath)!

        // Hit server
        let request = NSMutableURLRequest(URL: uploadURL)
        request.HTTPMethod = "POST"
        request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
        ...

private func buildQueryString(parameters: [String:String], omitQuestionMark: Bool = false) -> String {
    var urlVars = [String]()
    for (k, var v) in parameters {
        v = v.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!
        urlVars += [k + "=" + "\(v)"]
    }
    return ((urlVars.isEmpty || omitQuestionMark) ? "" : "?") + urlVars.joinWithSeparator("&")
}


private func imageToBase64(filename: String) -> String {
    // Get image path
    let imagePath = getFilePath(filename)

    // Convert image to base64 or return empty string
    if let imageData = NSData(contentsOfFile: imagePath) {
        let base64String = imageData.base64EncodedStringWithOptions(.EncodingEndLineWithLineFeed)
        return base64String
    } else {
        printError("Error converting image to Base64: missing image. Filename: \(filename)")
        return ""
    }
}

1 个答案:

答案 0 :(得分:0)

问题在于queryString,base64是包含多个字符的长文本,让JSON为您完成工作

使用下一个(使用NodeJS的一些示例)

  let params = NSMutableDictionary();
  //you can only set `serializable` values
  params.setValue(imageToBase64(),forKey:"base64")
  params.setValue(username,forKey:"username")
  params.setValue(["array","of","string"],forKey:"arr")

  let uploadURL = NSURL(string: theURL)!

  // Hit server
  let request = NSMutableURLRequest(URL: uploadURL)
  request.HTTPMethod = "POST"

  request.setValue("application/json", forHTTPHeaderField: "Content-Type")

  do {
      let jsonData = try NSJSONSerialization.dataWithJSONObject(params, options: NSJSONWritingOptions(rawValue: 0))
      request.HTTPBody = jsonData
      let session = NSURLSession.sharedSession()

      session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
          print("Response: \(response)")
      }).resume()


  } catch let error as NSError {
      print(error)
  }

的NodeJS:

var buffer = new Buffer(request.body["base64"], 'base64')
fs.writeFile('test.jpeg',buffer,"base64"); //Works
var username = request.body["username"];
var someStringsArr  = request.body["arr"]

顺便说一句......

您编写的函数buildQueryString已存在于Foundation

let urlComponents = NSURLComponents(string: "http://myUrl.com/getApi/")!
urlComponents.queryItems = [NSURLQueryItem]()
urlComponents.queryItems!.append(NSURLQueryItem(name:"myKeyA",value:"myValueA"))
urlComponents.queryItems!.append(NSURLQueryItem(name:"myKeyB",value:"myValueB"))

print(urlComponents.URL!) //http://myUrl.com/getApi/?myKeyA=myValueA&myKeyB=myValueB

如果想通过GET

发送URL参数,请使用网址查询