Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c RestKit图像上传_Objective C_Ios_Image_Upload_Restkit - Fatal编程技术网

Objective c RestKit图像上传

Objective c RestKit图像上传,objective-c,ios,image,upload,restkit,Objective C,Ios,Image,Upload,Restkit,我正在使用RestKit驱动与web服务器的交互。我正在尝试使用路由将事件对象发布到服务器,并附带一个图像。代码如下: RKObjectManager *manager = [RKObjectManager sharedManager]; RKObjectMapping *map = [self eventMapping]; manager.serializationMIMEType = RKMIMETypeFormURLEncoded; map.rootKeyPath = @

我正在使用RestKit驱动与web服务器的交互。我正在尝试使用路由将事件对象发布到服务器,并附带一个图像。代码如下:

  RKObjectManager *manager = [RKObjectManager sharedManager];

  RKObjectMapping *map = [self eventMapping];
  manager.serializationMIMEType = RKMIMETypeFormURLEncoded;
  map.rootKeyPath = @"event";
  [manager.mappingProvider setSerializationMapping:map forClass:[Event class]];
  [manager.router routeClass:[Event class] toResourcePath:@"/v1/events.json" forMethod:RKRequestMethodPOST];

  [manager postObject:event delegate:self block:^(RKObjectLoader *loader){
    RKObjectMapping *serMap = [[[RKObjectManager sharedManager] mappingProvider] serializationMappingForClass:[Event class]];
    NSError *error = nil;
    NSDictionary *d = [[RKObjectSerializer serializerWithObject:event mapping:serMap] serializedObject:&error];

    RKParams *p = [RKParams paramsWithDictionary:d];
    [p setData:[event imageData] MIMEType:@"image/jpeg" forParam:@"image"];
    loader.params = p;
  }];
如果我使用序列化事件对象创建RKParams的实例,然后添加图像数据并将其指定为RKObjectLoader的params属性,那么所有属性都将成为一个大规模序列化字符串。必须有一种方法来上传图像,而不需要大量的字符串序列化


我还尝试过将NSData属性映射到某个属性,并将UIImage一路转换为NSData,但RestKit抱怨它无法映射。以前有人这样做过吗?

我做了类似的事情,结果很好。我知道您的问题是为什么RKObjectSerializer没有按您期望的方式工作,但可能是您的设置有其他问题。我发布我的代码是为了给出一个清晰的例子,说明一些有用的东西。也就是说,在阅读了RKObjectSerializer文档之后,我不明白为什么不能以这种方式初始化RKParams,而不是像我在示例中那样直接设置它们

路由器设置:

RKObjectManager *objectManager = [RKObjectManager objectManagerWithBaseURL:kApiUrlBase];
[objectManager.router routeClass:[PAPetPhoto class] toResourcePath:@"/pet/uploadPhoto" forMethod:RKRequestMethodPOST];
RKObjectMapping *papetPhotoMapping = [RKObjectMapping mappingForClass:[PAPetPhoto class]];
[papetPhotoMapping mapKeyPath:@"id" toAttribute:@"identifier"];
[papetPhotoMapping mapAttributes:@"accountId", @"petId", @"photoId", @"filename", @"contentType", nil];
[objectManager.mappingProvider addObjectMapping:papetPhotoMapping];
[objectManager.mappingProvider setSerializationMapping:[papetPhotoMapping inverseMapping] forClass:[PAPetPhoto class]];
[objectManager.mappingProvider setMapping:papetPhotoMapping forKeyPath:@"petPhoto"];
- (void) objectLoader:(RKObjectLoader*)objectLoader didLoadObject:(id)object {

    if ([objectLoader wasSentToResourcePath:@"/pet/uploadPhoto"]) {
       PAPetPhoto *photo = (PAPetPhoto*)object;
    }
}
映射设置:

RKObjectManager *objectManager = [RKObjectManager objectManagerWithBaseURL:kApiUrlBase];
[objectManager.router routeClass:[PAPetPhoto class] toResourcePath:@"/pet/uploadPhoto" forMethod:RKRequestMethodPOST];
RKObjectMapping *papetPhotoMapping = [RKObjectMapping mappingForClass:[PAPetPhoto class]];
[papetPhotoMapping mapKeyPath:@"id" toAttribute:@"identifier"];
[papetPhotoMapping mapAttributes:@"accountId", @"petId", @"photoId", @"filename", @"contentType", nil];
[objectManager.mappingProvider addObjectMapping:papetPhotoMapping];
[objectManager.mappingProvider setSerializationMapping:[papetPhotoMapping inverseMapping] forClass:[PAPetPhoto class]];
[objectManager.mappingProvider setMapping:papetPhotoMapping forKeyPath:@"petPhoto"];
- (void) objectLoader:(RKObjectLoader*)objectLoader didLoadObject:(id)object {

    if ([objectLoader wasSentToResourcePath:@"/pet/uploadPhoto"]) {
       PAPetPhoto *photo = (PAPetPhoto*)object;
    }
}
帖子:(注意,因为我在块中建立了所有参数,所以我的对象只是一个虚拟实例,用于触发正确的路由和映射程序)

服务器端点(Java,Spring MVC)

代表:

RKObjectManager *objectManager = [RKObjectManager objectManagerWithBaseURL:kApiUrlBase];
[objectManager.router routeClass:[PAPetPhoto class] toResourcePath:@"/pet/uploadPhoto" forMethod:RKRequestMethodPOST];
RKObjectMapping *papetPhotoMapping = [RKObjectMapping mappingForClass:[PAPetPhoto class]];
[papetPhotoMapping mapKeyPath:@"id" toAttribute:@"identifier"];
[papetPhotoMapping mapAttributes:@"accountId", @"petId", @"photoId", @"filename", @"contentType", nil];
[objectManager.mappingProvider addObjectMapping:papetPhotoMapping];
[objectManager.mappingProvider setSerializationMapping:[papetPhotoMapping inverseMapping] forClass:[PAPetPhoto class]];
[objectManager.mappingProvider setMapping:papetPhotoMapping forKeyPath:@"petPhoto"];
- (void) objectLoader:(RKObjectLoader*)objectLoader didLoadObject:(id)object {

    if ([objectLoader wasSentToResourcePath:@"/pet/uploadPhoto"]) {
       PAPetPhoto *photo = (PAPetPhoto*)object;
    }
}

很好用!只需注意一点:试图通过设置RKObjectMapping的rootKeyPath属性将所有内容都限定为“事件”似乎不再有效。这在iOS 6中有效吗?我不断收到一个“RestKit被要求为请求重新传输一个新的正文流。可能是连接错误还是身份验证问题?”