2012-11-26 2 views
0

RestKit으로 POST 이미지 파일 전송을 여러 번 시도했지만 curl을 사용하여 지금까지 성공했습니다. 아래 작업 코드가 있지만 동기식이며 UI가 응답하지 않습니다. RestKit와RestKit 이미지 업로드 매개 변수

{ 
"asset"=>{ 
    "file"=>#<ActionDispatch::Http::UploadedFile:0xcfcc630 
    @original_filename="IMG_6236.JPG", 
    @content_type="image/jpeg", 
    @headers="Content-Disposition: form-data; name=\"asset[file]\"; filename=\"IMG_6272.JPG\"\r\nContent-Type: image/jpeg\r\n", 
    @tempfile=#<File:/tmp/RackMultipart20121117-21489-brm3b9>>, 
    "user_id"=>"522", 
    "checksum"=>"ab23bc492bac990d9022248315c743c1" 
    } 
} 

한 시도는이 게시물 (RestKit Image Upload)를 기반으로하지만, 자산 내에서 둥지 파일을하지 않습니다

NSArray *arguments = 
[NSArrayarrayWithObjects:assetScriptFullPath, 
    @"-F", [NSString stringWithFormat:@"asset[file][email protected]%@", fullPath], 
    @"-F", [NSString stringWithFormat:@"asset[user_id]=%d", user_id], 
    @"-F", [NSString stringWithFormat:@"asset[checksum]=%s", [(NSString *)md5hash UTF8String]], 
    nil]; 
NSTask *task = [NSTasklaunchedTaskWithLaunchPath:@"/usr/bin/curl"arguments:arguments]; 

컬 호출은 다음과 같이 서버에서 수신된다. '자산'내의 매개 변수를 중첩하려는 시도가 작동하지 않거나 충돌했습니다. 나는 (자산 내에서 파일)이 필요하거나 내가 사고없이 첨부 된 이미지 데이터를 얻을 수없는 계층을 얻을 수없는 I 중 하나를 아래 RestKit 고급 튜토리얼에 기술 된 방법을 사용하여

{ 
    "user_id"=>"522", 
    "checksum"=>"ab23bc492bac990d9022248315c743c1", 
    "file"=>#<ActionDispatch::Http::UploadedFile:0x883eb9c 
    @original_filename="file", 
    @content_type="image/jpeg", 
    @headers="Content-Disposition: form-data; name=\"file\"; filename=\"file\"\r\nContent-Type: image/jpeg\r\n", 
    @tempfile=#<File:/tmp/RackMultipart20121125-25702-ac8ck9>> 
} 

. 나는 충돌의 원인이되는 이미지를 첨부하려고 https://github.com/RestKit/RestKit/blob/master/Docs/MobileTuts%20Advanced%20RestKit/Advanced_RestKit_Tutorial.md 방법 중 하나는 여기에 설명되어 있습니다 : Serialize nested image in RestKit (Rails Backend)

{ 
"asset"=>{ 
    "user_id"=>"522", 
    "file"=>"@/Users/dev/IMG_6236.JPG", 
    "checksum"=>"ab23bc492bac990d9022248315c743c1" 
    } 
} 

모든 권고를? 감사!


서버가 기대하는 바를 바꿀 수 있으면 플랫 매개 변수 계층 구조로 작업 할 수 있습니다. 이것은 해결책이 아니며, 계층 구조를 변경할 수 없습니다. 코드는 다음과 같습니다.

[params setFile:asset forParam:@"file"]; 
[params setData:[name dataUsingEncoding:NSUTF8StringEncoding] forParam:@"name"]; 
[params setData:[user_id dataUsingEncoding:NSUTF8StringEncoding] forParam:@"user_id"]; 
[client post:assetScriptPath params:params delegate:self]; 

이것은 서버에서 보는 것입니다. 위와 같이 "자산"내에이 모든 것이 필요합니다.

{ 
    "file"=>#<ActionDispatch::Http::UploadedFile:0xcfcc630 
    @original_filename="IMG_6236.JPG", 
    @content_type="image/jpeg", 
    @headers="Content-Disposition: form-data; name=\"file\"; filename=\"IMG_6272.JPG\"\r\nContent-Type: image/jpeg\r\n", 
    @tempfile=#<File:/tmp/RackMultipart20121117-21489-brm3b9>>, 
    "user_id"=>"522", 
    "checksum"=>"ab23bc492bac990d9022248315c743c1" 
} 

답변

1

우리가하는 방식은 이미지를 base64Encoding으로 인코딩하고 서버 측에서 디코딩하는 것입니다.

이와 비슷한 것.

NSData *imageData = [NSData dataWithData:imageForUpload]; 
NSString *encodedString = [imageData base64Encoding]; 

그런 다음 일반적인 RestKit 게시물과 동일하게 작동합니다.

+0

빠른 응답을 보내 주셔서 감사합니다. base64Encoding 선택기가 없다는 오류가 나타납니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? –

+0

언급 했어야합니다. MGTwitterEngine.https의 Base64 추가 정보를 사용하고 있습니다. //github.com/mattgemmell/MGTwitterEngine/blob/master/NSData%2BBase64.m –

+0

고마워, base64 인코딩 이미지를 보내야합니다. 불행히도 다른 것들이 그것에 의존하기 때문에 나는 서버 측을 바꿀 수 없다. –