3

我正在使用 NSMutableURLRequest 将 base64 编码图像作为发布请求的一部分发送到服务器。我作为帖子正文记录的内容与服务器接收的内容不同。服务器似乎得到了一个截断的版本,就好像连接在中途中止一样。请看下面的代码:

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 正在将 + 从图像转换为空格。当我找出正确的发送方式时,我会发布答案。

4

2 回答 2

4

我能够将来自服务器的完整示例与 xcode 记录的内容进行比较,并发现+转换为[space]. 因为那是唯一有问题的字符,而且 iOS 中的 url 编码有问题,所以我只是做了

NSString *dataStr = [NSString stringWithFormat:@"request_data=%@",[reqStr stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"]];

服务器再次接受它们。我仍然不确定服务器是问题还是iOS。连接的其他操作系统使用相同的 application/x-www-form-urlencoded 作为其内容类型,没有问题。

于 2013-01-14T20:38:40.000 回答
1

NSData我建议通过Nick Lockwood 的 Base64 类进行从 Base64 字符串的转换。

NSData *dataForUrl = [dataStr dataUsingEncoding:NSUTF8StringEncoding];

让我有点担心(在查看 Base64 是如何实现转换之后更是如此)......

于 2013-01-14T18:17:58.450 回答