2012-09-26 21 views
7

Vấn đề

Tôi đã cố gắng đăng lên máy chủ với yêu cầu đa dạng bao gồm tệp đính kèm hình ảnh. Tôi chưa gặp sự cố khi tải hình ảnh lên máy chủ, đó là thông tin khác không gửi đúng.Restkit MultiForm Đăng với một hình ảnh

Chi tiết

Tôi đang sử dụng bản đồ đối tượng để cấu hình các thuộc tính khác nhau khi nhận được các đối tượng từ các máy chủ:

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

Sau đó, khi nói đến thời gian để gửi một bức ảnh tôi cập nhật cấu hình như sau:

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

Những người tham gia là những người được gắn thẻ với ảnh. Đây là cách tôi gửi bài nó, tương tự như sau 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; 
    }]; 

Các máy chủ đang nhận được hình ảnh như kế hoạch, và thực sự không nhận được 'tạo ra' và 'tham gia' rất tiếc là trong một định dạng lạ mà máy chủ không hiểu. Nó bao gồm ngắt dòng và như vậy participants (\n 19843589323 \n created: \n 3-31-2012 00:00 (một cái gì đó như thế, tôi sẽ cập nhật khi tôi có quyền truy cập vào các bản ghi.

Tôi sẽ cung cấp cho bạn thêm bất kỳ thông tin nào bạn cần.)

+0

bạn có nghĩa là một POST với Content-type 'multipar t/form-data'? Bạn có khăng khăng sử dụng RestKit cho việc này không? – leo

+0

Tôi thích gắn bó với Restkit hơn, và tôi tin rằng dữ liệu đa dạng/biểu mẫu là đúng .. nhưng bạn có thể xây dựng được không? –

+0

Không thể giúp bạn với RestKit, nhưng nếu nó không phải là một yêu cầu, nhiều giải pháp khác có sẵn. Sáng nay, tôi đặt một câu chuyện trực tuyến để chơi với nhiều phần/biểu mẫu dữ liệu, có giao diện [https://gist.github.com/3786554](https://gist.github.com/3786554) – leo

Trả lời

14

trong RestKit 0.20.0-pre3, RKObjectManager không có phương pháp multipartFormRequestWithObject:method:path:parameters:constructingBodyWithBlock:

+0

Tôi thực sự đã kết thúc bằng cách sử dụng kỹ thuật này, ngớ ngẩn tôi vì không thêm nó vào câu trả lời được chấp nhận. Cảm ơn bạn. –

11

một ví dụ về công việc này có thể được tìm thấy tại 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

Tại sao lại enqueued hơn là bắt đầu? – fellowworldcitizen

Các vấn đề liên quan