2014-09-01 5 views
4

Я знаю, что это может показаться специфичным для данной проблемы, однако это я стараюсь избегать ужасного использования какао-контейнеров в UploadCare, которое содержит значительное (и довольно устаревшее) количество зависимостей, чтобы просто загрузить файл (а затем загрузить его позднее).cURL upload photo command в формате NSMutableURLRequest

Я изо всех сил пытаюсь перевести опции '-F' в команду cURL. Я понимаю, что они указывают 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

Привет, Русик, он дает мне 403, когда я использую это, когда автозапуск выключен, и UPLOADCARE_STORE == 1: как я могу сохранить файл на сервере, когда автозапуск отключен? – Rambatino

+0

Autostore - это возможность хранить файлы во время загрузки. Вы должны разрешить автозагрузку в настройках проекта, чтобы он работал. Обычным магазином является запрос API REST, который можно сделать в течение 24 часов после загрузки: https://uploadcare.com/documentation/rest/#file-store – homm