2012-09-26 14 views
7

Problema

Ho cercato di inviare al server con una richiesta multiform che include un allegato immagine. Non ho avuto problemi a ottenere l'immagine sul server, sono le altre informazioni che non vengono inviate correttamente.Post MultiForm Restkit con un'immagine

dettagli

sto usando la mappatura oggetto di configurare diversi attributi diversi quando si ricevono gli oggetti dal server:

//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; 

Poi, quando arriva il momento di pubblicare una foto aggiorno configurazioni come segue:

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"]; 

I partecipanti sono persone taggate con la foto. Ecco come sto postando esso, simile a questo 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; 
    }]; 

Il server sta ricevendo l'immagine come previsto, e in realtà non ricevere il 'create' e 'partecipanti' Purtroppo è in un formato strano che il server non capisce Comprende interruzioni di riga e tali participants (\n 19843589323 \n created: \n 3-31-2012 00:00 (qualcosa di simile, aggiornerò quando avrò accesso ai registri.

Ti fornirò ogni informazione in più che ti serve.Offrirei la reputazione se ne avessi abbastanza da farlo;)

+0

cosa si intende un post con Content-type 'multipar t/form-data'? Insisti a utilizzare RestKit per questo? – leo

+0

Preferirei restare con il Restkit, e credo che un multipart/form-data abbia ragione ... ma potresti elaborarlo? –

+0

Non posso aiutarti con RestKit, ma se non è un requisito, sono disponibili molte altre soluzioni. Stamattina ho messo un sommario online per giocare con multipart/form-data, dare un'occhiata [https://gist.github.com/3786554](https://gist.github.com/3786554) – leo

risposta

14

In RestKit 0.20.0-pre3, RKObjectManager ha metodo multipartFormRequestWithObject:method:path:parameters:constructingBodyWithBlock:

+0

In realtà ho finito per usare questa tecnica, stupido per non averlo aggiunto alle risposte accettate. Grazie. –

11

un esempio di questo compito può essere trovato al 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

Perché accodato anziché avviato? – fellowworldcitizen

Problemi correlati