我正在使用NSMutableURLRequest将base64编码的图像作为post请求的一部分发送到服务器。我作为帖子正文记录的内容和服务器收到的内容不是一回事。服务器似乎得到截断版本,好像连接中途中止。请参阅以下代码:
NSString *dataStr = [NSString stringWithFormat:@"request_data=%@",reqStr];
NSLog(@"datastr is %@",dataStr);
NSData *dataForUrl = [dataStr dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"nsdata length is: %i",[dataForUrl length]);
[urlRequest setHTTPBody:dataForUrl];
[urlRequest setValue:[NSString stringWithFormat:@"%d", [dataForUrl length]] forHTTPHeaderField:@"Content-Length"];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *res, NSData *data, NSError *err) {
// ...
}
第一个日志语句显示正确的数据。我甚至将字符串的base64部分带到http://www.motobit.com/util/base64-decoder-encoder.asp,将其解码为jpg,这是正确的图像。第二个日志语句显示长度是正确的大小(例如,当图片为422480时为422624)。
我发现连接细节或数据没有任何问题。手机进行连接,发送一些数据,然后手机停止发送或服务器停止接收。什么可能导致这种情况?
修改:链接到示例数据http://pastebin.com/BS9HjKhg
Edit2:服务器或iOS正在将+从图像转换为空格。当我找出发送它的正确方法时,我会发一个答案。
答案 0 :(得分:3)
我能够比较服务器的完整样本与xcode记录的样本,并发现+
已转换为[space]
。由于那是唯一一个有问题且url编码在iOS中出错的角色,我只是做了
NSString *dataStr = [NSString stringWithFormat:@"request_data=%@",[reqStr stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"]];
服务器再次接受它们。我还不确定服务器是问题还是iOS。连接的其他操作系统使用相同的application / x-www-form-urlencoded作为其内容类型,没有任何问题。
答案 1 :(得分:1)
我建议将Base64字符串转换为NSData
到Nick Lockwood's Base64 class。
那
NSData *dataForUrl = [dataStr dataUsingEncoding:NSUTF8StringEncoding];
让我有点担忧(看看Base64如何实现转换后更是如此)......