2015-06-14 2 views
0

Я пытаюсь загрузить файл в учетную запись коробки с использованием API-интерфейса ящика окна (не IOS SDK), но по какой-то причине он не работает и не возвращает код состояния 400. Какая моя ошибка в следующем коде?box file upload api из iOS не работает

NSString *uploadURL = @"https://upload.box.com/api/2.0/files/content"; 
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; 

NSURLSession *upLoadSession = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil]; 

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:uploadURL]]; 
[request setHTTPMethod:@"POST"]; 

[request addValue:[NSString stringWithFormat:@"Bearer %@", @"box_access_token_here"] forHTTPHeaderField:@"Authorization"]; 

NSString *boundary = @"some_random_boundary_value"; 
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]; 
[request addValue:contentType forHTTPHeaderField:@"Content-Type"]; 
NSMutableData *body = [NSMutableData data]; 

[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"Content-Disposition: form-data; name=\"attributes\"\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"Content-Type: application/json\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithFormat:@"'{\"name\":\"%@\", \"parent\":{\"id\":\"%@\"}}'", @"file_name", @"box_folder_id"] dataUsingEncoding:NSUTF8StringEncoding]]; 

[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"Content-Disposition: form-data; name=\"file\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithFormat:@"Content-Type: %@\r\n\r\n", @"mime_type"] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:UIImageJPEGRepresentation(someUIImage, 1.0)]; 

[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)body.length] forHTTPHeaderField:@"Content-Length"]; 
[request setHTTPBody:body]; 

NSURLSessionUploadTask *uploadTask = [upLoadSession uploadTaskWithRequest:request fromData:body completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
    if (error) { 
     NSLog(@"%@", error.debugDescription); 
    } else { 
     NSLog(@"%@", @"Successfully uploaded"); 
    } 
}]; 

[uploadTask resume]; 
+0

Это может быть проще отладить, если вы можете включить копию необработанного HTTP-запроса, отправляемого в API. Обычно 400 с загрузкой происходят из-за тонких ошибок с помощью многопрофильного запроса. – Greg

ответ

0

Я не уверен, что это неправильно с кодом, но я получаю то же 400 Bad Request когда пытался осуществить загрузку в пути он описанный здесь https://box-content.readme.io/#upload-a-file.

я в конечном итоге тиражирование поведение, Android пример кода использует - и это несколько отличается от того, что в API документации:

Content-Type: multipart/form-data; boundary=dcf6d5da-6b79-4d80-8503-9ca17037e7c3 
Content-Length: 757 
--dcf6d5da-6b79-4d80-8503-9ca17037e7c3 
Content-Disposition: form-data; name="parent_id" 
Content-Type: text/plain; charset=UTF-8 
Content-Length: 10 
Content-Transfer-Encoding: binary 

3973764013 
--dcf6d5da-6b79-4d80-8503-9ca17037e7c3 
Content-Disposition: form-data; name="filename"; filename="your-file-name" 
Content-Type: text/html 
Content-Length: 300 
Content-Transfer-Encoding: binary 

your file binary content goes here 
--dcf6d5da-6b79-4d80-8503-9ca17037e7c3-- 

Пожалуйста, обратите внимание, как используются parent_id и filename части - это вполне в отличие от того, что это советы в документах API.