7

問題

画像の添付ファイルを含むマルチフォームリクエストを使用してサーバーに投稿しようとしています。サーバーに画像を取得するのに問題はありません。正しく送信されていないのは他の情報です。

詳細

サーバーからオブジェクトを受信するときに、オブジェクトマッピングを使用していくつかの異なる属性を構成しています。

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

次に、写真を投稿するときに、次のように構成を更新します。

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

参加者は写真でタグ付けされた人です。これが私が投稿する方法です。これは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;
    }];

サーバーは計画どおりに画像を受信して​​おり、実際には「作成済み」と「参加者」を受信して​​います。残念ながら、サーバーが理解できない奇妙な形式になっています。改行などが含まれますparticipants (\n 19843589323 \n created: \n 3-31-2012 00:00 (そのようなもので、ログにアクセスできるようになったら更新します。

必要な追加情報をお知らせします。私がそうするのに十分であるならば、それに対する評判を提供するでしょう;)

4

2 に答える 2

14

RestKit 0.20.0-pre3では、RKObjectManagerメソッドがありますmultipartFormRequestWithObject:method:path:parameters:constructingBodyWithBlock:

于 2012-12-12T20:18:25.747 に答える
11

このタスクの例は、RestKitGithubページにあります。

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
于 2014-05-14T15:06:09.920 に答える