2012-09-26 15 views
7

Problem

Próbowałem wysłać do serwera z prośbą wielopostaciową, która zawiera załącznik obrazu. Nie miałem problemu z uzyskaniem obrazu na serwer, to inne informacje, które nie są wysyłane poprawnie.Post Office MultiForm Post z obrazem

Szczegóły

Używam odwzorowania obiektu, aby skonfigurować kilka różnych atrybutów podczas odbierania przedmiotów z serwera:

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

Potem, gdy przychodzi czas, aby opublikować zdjęcie zaktualizować konfiguracje, co następuje:

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

Uczestnikami są ludzie otagowani zdjęciem. Oto jak ja umieszczenie go, podobny do tego 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; 
    }]; 

Serwer odbiera obraz zgodnie z planem, a faktycznie ma otrzymać „stworzył” i „uczestnicy” niestety jest w dziwnym formacie, że serwer nie rozumie. Obejmuje ona podziały wiersza i taki participants (\n 19843589323 \n created: \n 3-31-2012 00:00 (coś takiego, będę aktualizował gdy mam dostęp do dzienników

dam ci żadnych dodatkowych informacji trzeba będzie oferować reputacji za to, gdybym miał na tyle, aby to zrobić..;)

+0

Czy chodziło Ci o stanowisko z Content-Type 'multipar t/form-data'? Czy nalegasz na używanie RestKit do tego? – leo

+0

Wolałbym trzymać się Restkita, i wierzę, że wieloczęściowe/dane formularza są słuszne .. ale czy mógłbyś je rozwinąć? –

+0

Nie można pomóc w programie RestKit, ale jeśli nie jest to wymagane, dostępnych jest wiele innych rozwiązań. Dziś rano postawiłem online na grę z wieloczęściowymi/formularzowymi danymi, zajrzyj [https://gist.github.com/3786554](https://gist.github.com/3786554) – leo

Odpowiedz

14

W RestKit 0.20.0-pre3, RKObjectManager ma metoda multipartFormRequestWithObject:method:path:parameters:constructingBodyWithBlock:

+0

Tak naprawdę skończyłem, używając tej techniki, głupio mnie, że nie dodałem jej do zaakceptowanych odpowiedzi. Dziękuję Ci. –

11

przykładem tego zadania można znaleźć w 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

Dlaczego zamiast kupować? – fellowworldcitizen