将UIImage编码为Base64string时,传输到服务器时不起作用

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

关于这个问题的任何build议?

// 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为你做好工作

使用下一个(以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 

如果要通过URL发送GET参数,请使用URL查询