字符串在传输到服务器时不起作用

字符串在传输到服务器时不起作用

本文介绍了将 UIImage 编码为 Base64 字符串在传输到服务器时不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Encoding an UIImage as a Base64 string works on the device, but transferring the string to the server somehow corrupts the string and prevents the server from successfully decoding the image.

对这个问题有什么建议吗?

Any suggestions on the problem?

        // 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 ""
    }
}

推荐答案

问题出在 queryString 上,base64 是有很多字符的长文本,让 JSON 来做为你工作

The problem is with the queryString, base64 is long text with many characters, let JSON do the work for you

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

Use the next (with some example of 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)
  }

节点:

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

you wrote the function buildQueryString, which is already exists in 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

如果要通过 URL

这篇关于将 UIImage 编码为 Base64 字符串在传输到服务器时不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-05 23:06