2012-09-26 13 views
7

Problema

He intentado publicar en el servidor con una solicitud multiforme que incluye una imagen adjunta. No he tenido problemas para obtener la imagen en el servidor, es la otra información que no se envía correctamente.Restkit MultiForm Publicar con una imagen

detalles

estoy usando mapeo objeto de configurar varios atributos distintos al recibir objetos desde el servidor:

//Using a custom class to map object I receive to 
RKObjectMapping * memoryMapper = [RKObjectMapping mappingForClass:[MemoContent class]]; 
[memoryMapper mapAttributes:@"created", @"user", @"participants", @"tags", @"text", @"kind", @"video", @"location", nil]; 
[memoryMapper mapKeyPath:@"_id" toAttribute:@"memoryID"]; 

//MediaMapper handles the data needed for the Image attachments 
RKObjectMapping * mediaMapper = [RKObjectMapping mappingForClass:[MemoMedia class]]; 
[mediaMapper mapKeyPath:@"processed" toAttribute:@"processed"]; 
[mediaMapper mapKeyPath:@"original" toAttribute:@"original"]; 
[mediaMapper mapKeyPath:@"mime" toAttribute:@"mimeType"]; 
[memoryMapper mapKeyPath:@"media" toRelationship:@"rawMedia" withMapping:mediaMapper]; 

// 
[[RKObjectManager sharedManager].mappingProvider setMapping:memoryMapper forKeyPath:@"memories"]; 
[RKObjectManager sharedManager].serializationMIMEType = RKMIMETypeFormURLEncoded; 
[RKObjectManager sharedManager].acceptMIMEType = RKMIMETypeJSON; 

Luego, cuando llega el momento de publicar una foto que actualizar las configuraciones de la siguiente manera:

RKObjectMapping * memoryMapper = [RKObjectMapping mappingForClass:[MemoContent class]]; 
[memoryMapper mapAttributes:@"created", @"participants", nil]; 
[[RKObjectManager sharedManager].mappingProvider setSerializationMapping:memoryMapper forClass:[MemoContent class]]; 
[[RKObjectManager sharedManager].mappingProvider setMapping:memoryMapper forKeyPath:@"memory"]; 

Los participantes son las personas etiquetadas con la foto. Así es como he publicado, similar a este https://github.com/RestKit/RestKit/wiki/Attach-a-File-to-an-RKObjectLoader

[[RKObjectManager sharedManager] postObject:theMemory usingBlock:^(RKObjectLoader * loader){ 

    RKObjectMapping* serializationMapping = [[[RKObjectManager sharedManager] mappingProvider] serializationMappingForClass:[MemoContent class]]; 
    NSLog(@"serializationMapping: %@", serializationMapping); 
    loader.delegate = APP; //main app delegate posting, updating 
    NSError* error = nil; 
    RKObjectSerializer * serializer = [[RKObjectSerializer alloc] initWithObject:theMemory mapping:serializationMapping]; 
    NSDictionary * dictionary = [serializer serializedObject:&error]; 
    RKParams * params = [RKParams paramsWithDictionary:dictionary]; 
    NSData * imageData = UIImagePNGRepresentation(theMemory.photo); //image data 
    [params setData:imageData MIMEType:@"image/png" forParam:@"attachment"]; 
    loader.params = params; 
    loader.serializationMIMEType = RKMIMETypeFormURLEncoded; 
    }]; 

El servidor recibe la imagen tal como estaba previsto, y en realidad no reciben la 'creados' y 'participantes' Por desgracia, es en un formato extraño que el servidor no entiende Incluye saltos de línea y tal participants (\n 19843589323 \n created: \n 3-31-2012 00:00 (algo así, lo actualizaré cuando tenga acceso a los registros.

Le daré toda la información adicional que necesite. Ofrecería reputación si tuviera suficiente para hacerlo;)

+0

qué quiere decir un post con contenido de tipo 'multipar t/form-data'? ¿Insiste en usar RestKit para esto? – leo

+0

Preferiría quedarme con Restkit, y creo que un multipart/form-data es correcto ... ¿pero podría dar más detalles? –

+0

No se puede ayudar con RestKit, pero si no es un requisito, hay muchas otras soluciones disponibles. Esta mañana puse un gist en línea para jugar con multipart/form-data, eche un vistazo [https://gist.github.com/3786554](https://gist.github.com/3786554) – leo

Respuesta

14

en RestKit 0.20.0-pre3, RKObjectManager tiene método multipartFormRequestWithObject:method:path:parameters:constructingBodyWithBlock:

+0

De hecho terminé usando esta técnica, me molesta por no agregarlo a las respuestas aceptadas. Gracias. –

11

un ejemplo de esta tarea se puede encontrar en la RestKit Github page:

Article *article = [Article new]; 
UIImage *image = [UIImage imageNamed:@"some_image.png"]; 

// Serialize the Article attributes then attach a file 
NSMutableURLRequest *request = [[RKObjectManager sharedManager] multipartFormRequestWithObject:article method:RKRequestMethodPOST path:nil parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
    [formData appendPartWithFileData:UIImagePNGRepresentation(image) 
           name:@"article[image]" 
          fileName:@"photo.png" 
          mimeType:@"image/png"]; 
}]; 

RKObjectRequestOperation *operation = [[RKObjectManager sharedManager] objectRequestOperationWithRequest:request success:nil failure:nil]; 
[[RKObjectManager sharedManager] enqueueObjectRequestOperation:operation]; // NOTE: Must be enqueued rather than started 
+0

¿Por qué se puso en cola en lugar de comenzar? – fellowworldcitizen