2014-09-01 7 views
4

이 문제는 당면한 문제로 보일 수 있습니다. 그러나 이것은 중요한 (오히려 구형 인) 양의 종속성이 포함 된 코코아 더미의 끔찍한 UploadCare 사용을 피하려고합니다. 파일을 업로드하고 나중에 나중에 다운로드하십시오.cURL NSMutableURLRequest 형식의 사진 업로드 명령

나는 cURL 명령에서 '-F'옵션을 번역하는 데 어려움을 겪고 있습니다. HTTP multipart POST 데이터를 지정하는 것으로 알고 있지만 첨부 된 그림 파일로 NSMutableData로 변환하는 것은 어렵습니다. 403 상태 코드가 계속 수신됩니다.

컬 명령은 다음과 같습니다

curl -F "UPLOADCARE_PUB_KEY=e84a031b3da1g560d56d" \ 
-F "UPLOADCARE_STORE=1" \ 
-F "[email protected]" https://upload.uploadcare.com/base/ 

나의 현재의 시도는 다음과 같습니다

NSMutableData *body = [NSMutableData data]; 
NSData *imageData = UIImageJPEGRepresentation(image, 0.6); 
if (imageData) { 
    [body appendData:[@"UPLOADCARE_PUB_KEY=e84a031b3da1g560d56d" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"UPLOADCARE_STORE=1" dataUsingEncoding:NSUTF8StringEncoding]]; 

    [body appendData:[[NSString stringWithFormat:@"file="] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:imageData]; 
} 

NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; 

NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:nil]; 

NSURL *url = [NSURL URLWithString:baseUrl]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
request.HTTPMethod = @"POST"; 
request.HTTPBody = imageData; 
NSURLSessionDataTask *uploadTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
    NSLog(@"%@",response); 
}]; 
[uploadTask resume]; 

은 무엇 나는 NSMutableData으로 잘못하고 있는가?

두 번째 질문은 다음과 같습니다. 객관적인 -C lib 컬 래퍼를 사용하는 것이 가치가 있습니까?

+0

당신은 (무효) URLSession을 구현 : (NSURLSession *) 세션 didReceiveChallenge : 방법은? 403과 관련 될 수 있습니다. – Xcoder

+0

에서와 같이 위임 메서드를 호출해서는 안됩니다. 내가 실행 한 유일한 코드는 여기에 게시 한 것입니다 (대리자 호출에서 참조 할 필요가 없다고 생각합니다). 그러나 대리자 메서드로 무엇을해야하는지 잘 모르겠습니다. 내가 지금 방금 추가했을 때 아무 것도하지 않는 것 같다. – Rambatino

답변

3
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://upload.uploadcare.com/base/"]]; 

    UIImage *image = [UIImage imageNamed:@"image.jpg"]; 
    NSData *imageData = UIImageJPEGRepresentation(image, 1.0); 

    [request setHTTPMethod:@"POST"]; 

    NSString *boundary = @"unique-consistent-string"; 

    // set Content-Type in HTTP header 
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]; 
    [request setValue:contentType forHTTPHeaderField: @"Content-Type"]; 

    // post body 
    NSMutableData *body = [NSMutableData data]; 

    // add params (all params are strings) 
    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=%@\r\n\r\n", @"UPLOADCARE_PUB_KEY"] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithFormat:@"%@\r\n", @"demopublickey"] dataUsingEncoding:NSUTF8StringEncoding]]; 

    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=%@\r\n\r\n", @"UPLOADCARE_STORE"] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithFormat:@"%@\r\n", @"1"] dataUsingEncoding:NSUTF8StringEncoding]]; 

    // add image data 
    if (imageData) { 
     [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
     [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=file; filename=image.jpg\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
     [body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
     [body appendData:imageData]; 
     [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
    } 

    [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

    // setting the body of the post to the reqeust 
    [request setHTTPBody:body]; 

    // set the content-length 
    NSString *postLength = [NSString stringWithFormat:@"%d", [body length]]; 
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 

    [NSURLConnection sendAsynchronousRequest:request 
             queue:[NSOperationQueue currentQueue] 
          completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 

           if (data.length > 0) { 
            NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); 
           } 
    }]; 

http://nthn.me/posts/2012/objc-multipart-forms.html

https://gist.github.com/mombrea/8467128

+0

안녕하세요. 훌륭합니다. 완벽하게 작동합니다. 감사합니다. – Rambatino

+0

안녕하세요 Rusik, autostore가 해제되어 있고 UPLOADCARE_STORE == 1 일 때 autoseore가 꺼져있을 때이 파일을 서버에 저장하려면 어떻게합니까? – Rambatino

+0

자동 저장 - 업로드하는 동안 파일을 저장하는 옵션입니다. 프로젝트 설정에서 오토 스토어가 작동하도록 허용해야합니다. 일반 상점은 업로드 후 24 시간 이내에 REST API에 대한 요청입니다. https://uploadcare.com/documentation/rest/#file-store – homm