我正在尝试使用base64编码对图像进行编码并将其传递给JSON,以生成JSON请求并调用RESTful API我正在使用RestKit。
我在日志中看到的是RestKit将转义字符添加到编码图像,这阻止了服务器端有效解码图像并失败。
我想知道什么是阻止RestKit添加转义字符的最佳选择
下面是示例
VpT\/X8WWDCpj1XBpJ1zPBDuwLHLnpCZgnmLX3EXaffi0p7NklAPgO7HZsmxzC\/XITc\/K4iwRSG
可以看到字符串中添加了斜杠(\/
)。
以下是我用于编码字符串
的代码NSData *originalPhoto = UIImagePNGRepresentation([UIImage imageNamed:@"Time_Icon.png"]);
NSString *base64PhotoString = [Base64 encode:originalPhoto];
Base64.m如下
+ (NSString*) encode:(const uint8_t*) input length:(NSInteger) length {
NSMutableData* data = [NSMutableData dataWithLength:((length + 2) / 3) * 4];
uint8_t* output = (uint8_t*)data.mutableBytes;
for (NSInteger i = 0; i < length; i += 3) {
NSInteger value = 0;
for (NSInteger j = i; j < (i + 3); j++) {
value <<= 8;
if (j < length) {
value |= (0xFF & input[j]);
}
}
NSInteger index = (i / 3) * 4;
output[index + 0] = encodingTable[(value >> 18) & 0x3F];
output[index + 1] = encodingTable[(value >> 12) & 0x3F];
output[index + 2] = (i + 1) < length ? encodingTable[(value >> 6) & 0x3F] : '=';
output[index + 3] = (i + 2) < length ? encodingTable[(value >> 0) & 0x3F] : '=';
}
return [[[NSString alloc] initWithData:data
encoding:NSASCIIStringEncoding] autorelease];
}
+ (NSString*) encode:(NSData*) rawBytes {
return [self encode:(const uint8_t*) rawBytes.bytes length:rawBytes.length];
}
我将此编码字符串作为字符串传递给RestKit请求
答案 0 :(得分:0)
如果我没有错,你会被困在通过restkit发送图像到服务器。我的朋友尝试使用multipart。
在Restkit v0.20.3中几乎没有变化。在这里,我通过RkObjectManager实例为多部分帖子添加代码片段。
NSString *strTextToPost = self.txtViewForPost.text;
NSMutableDictionary *params = [NSMutableDictionary dictionary];
mediaType ? [params setObject:mediaType forKey:@"MEDIA_TYPE"] : @"";
strTextToPost ? [params setObject:strTextToPost forKey:@"POST_TEXT"] : @"" ;
NSMutableURLRequest *request = [[AppDelegate appDelegate].rkomForPost multipartFormRequestWithObject:nil method:RKRequestMethodPOST path:strPath parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
[formData appendPartWithFileData:contentData
name:@"FILE"
fileName:fileName
mimeType:fileType];
}];
RKObjectRequestOperation *operation = [[AppDelegate appDelegate].rkomForPost objectRequestOperationWithRequest:request success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
[RSActivityIndicator hideIndicator];
NSLog(@"%@",operation.HTTPRequestOperation.responseString);
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
[RSActivityIndicator hideIndicator];
NSLog(@"%@",operation.HTTPRequestOperation.responseString);
}];
[[AppDelegate appDelegate].rkomForPost enqueueObjectRequestOperation:operation];
enqueueObjectRequestOperation将完成多部分操作。尝试使用给定的代码。当然它会起作用。
答案 1 :(得分:0)
在iOS 7和Mac OS 10.9 SDK中,Apple在NSData上引入了新的base64方法,因此无需使用第三方base 64解码库。
但根据我的经验,我在使用Apple提供的base64方法时遇到了问题,并且无法解码我的base64 pdf(来自.net服务器)。
所以我尝试了this库,每次都对我有用。我认为这对你也有用。
答案 2 :(得分:0)
由于restkit使用AFNetworking并且它似乎是将转义字符添加到编码图像中,我的服务器端无法处理,我已经确认这是AFNetworking问题而不是Restkit本身,看起来他们已经在2.0中解决了它因为RestKit坚持使用旧版本它无法解决,最后我放弃并选择了ASIHTTP库并手动传递JSON,确保base64编码图像不会被篡改。这解决了这个问题。