objective-c – RestKit图像上传

前端之家收集整理的这篇文章主要介绍了objective-c – RestKit图像上传前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用RestKit来驱动与我的Web服务器的互动.我正在尝试使用路由将一个Event对象POST到一个连接到它的服务器上.代码如下:
  1. RKObjectManager *manager = [RKObjectManager sharedManager];
  2.  
  3. RKObjectMapping *map = [self eventMapping];
  4. manager.serializationMIMEType = RKMIMETypeFormURLEncoded;
  5. map.rootKeyPath = @"event";
  6. [manager.mappingProvider setSerializationMapping:map forClass:[Event class]];
  7. [manager.router routeClass:[Event class] toResourcePath:@"/v1/events.json" forMethod:RKRequestMethodPOST];
  8.  
  9. [manager postObject:event delegate:self block:^(RKObjectLoader *loader){
  10. RKObjectMapping *serMap = [[[RKObjectManager sharedManager] mappingProvider] serializationMappingForClass:[Event class]];
  11. NSError *error = nil;
  12. NSDictionary *d = [[RKObjectSerializer serializerWithObject:event mapping:serMap] serializedObject:&error];
  13.  
  14. RKParams *p = [RKParams paramsWithDictionary:d];
  15. [p setData:[event imageData] MIMEType:@"image/jpeg" forParam:@"image"];
  16. loader.params = p;
  17. }];

如果我使用序列化的事件对象创建一个RKParams的实例,则添加图像数据并将其分配为RKObjectLoader的params属性,所有属性都将成为一个巨大的序列化字符串.必须有一种方法上传图像,而不需要大量字符串序列化.

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

解决方法

我做了非常相似的事情,它的工作很好.我意识到你的问题是为什么RKObjectSerializer不按照你的期望工作,但也许这是你的设置的其他东西.我发布我的代码,给出一个干净的例子.也就是说,在阅读RKObjectSerializer文档之后,我不明白为什么你不能像我的例子那样直接初始化RKParams,而不是直接设置它们.

路由器设置:

  1. RKObjectManager *objectManager = [RKObjectManager objectManagerWithBaseURL:kApiUrlBase];
  2. [objectManager.router routeClass:[PAPetPhoto class] toResourcePath:@"/pet/uploadPhoto" forMethod:RKRequestMethodPOST];

映射设置:

  1. RKObjectMapping *papetPhotoMapping = [RKObjectMapping mappingForClass:[PAPetPhoto class]];
  2. [papetPhotoMapping mapKeyPath:@"id" toAttribute:@"identifier"];
  3. [papetPhotoMapping mapAttributes:@"accountId",@"petId",@"photoId",@"filename",@"contentType",nil];
  4. [objectManager.mappingProvider addObjectMapping:papetPhotoMapping];
  5. [objectManager.mappingProvider setSerializationMapping:[papetPhotoMapping inverseMapping] forClass:[PAPetPhoto class]];
  6. [objectManager.mappingProvider setMapping:papetPhotoMapping forKeyPath:@"petPhoto"];

(我注意到,自从我建立了所有我的params在块中我的对象只是一个虚拟实例来触发正确的路由和映射器).

  1. PAPetPhoto *photo = [[PAPetPhoto alloc] init];
  2. [[RKObjectManager sharedManager] postObject:photo delegate:self block:^(RKObjectLoader *loader){
  3.  
  4. RKParams* params = [RKParams params];
  5. [params setValue:pet.accountId forParam:@"accountId"];
  6. [params setValue:pet.identifier forParam:@"petId"];
  7. [params setValue:_photoId forParam:@"photoId"];
  8. [params setValue:_isThumb ? @"THUMB" : @"FULL" forParam:@"photoSize"];
  9. [params setData:data MIMEType:@"image/png" forParam:@"image"];
  10.  
  11. loader.params = params;
  12. }];

服务器端点(Java,Spring MVC)

  1. @RequestMapping(value = "/uploadPhoto",method = RequestMethod.POST)
  2. @ResponseBody
  3. public Map<String,Object> handleFormUpload(@RequestParam("accountId") String accountId,@RequestParam("petId") String petId,@RequestParam("photoId") String photoId,@RequestParam("photoSize") PhotoSizeEnum photoSize,@RequestParam("image") Part image) throws IOException {
  4.  
  5. if (log.isTraceEnabled())
  6. log.trace("uploadPhoto. accountId=" + accountId + " petId=" + petId + " photoId=" + photoId + " photoSize=" + photoSize);
  7.  
  8. PetPhoto petPhoto = petDao.savePetPhoto(accountId,petId,photoId,photoSize,image);
  9.  
  10. Map<String,Object> map = GsonUtils.wrapWithKeypath(petPhoto,"petPhoto");
  11. return map;
  12. }

服务器响应JSON(注意对应于映射设置的“petPhoto”的keyPath):

  1. {
  2. petPhoto = {
  3. accountId = 4ebee3469ae2d8adf983c561;
  4. contentType = "image/png";
  5. filename = "4ebee3469ae2d8adf983c561_4ec0983d036463d900841f09_3FED4959-1042-4D8B-91A8-76AA873851A3";
  6. id = 4ee2e80203646ecd096d5201;
  7. petId = 4ec0983d036463d900841f09;
  8. photoId = "3FED4959-1042-4D8B-91A8-76AA873851A3";
  9. };
  10. }

代表:

  1. - (void) objectLoader:(RKObjectLoader*)objectLoader didLoadObject:(id)object {
  2.  
  3. if ([objectLoader wasSentToResourcePath:@"/pet/uploadPhoto"]) {
  4. PAPetPhoto *photo = (PAPetPhoto*)object;
  5. }
  6. }

猜你在找的C&C++相关文章