2013-11-27 2 views
2

Я хочу загрузить видео с помощью запроса PUT, и это мой опыт.Запрос PUT с данными с использованием AFNetworking 2.0

Я пытался много вариантов выполнения запроса PUT с использованием AFNetworking 2.0, но все не удается.

Но я решил это, и этот «вопрос» является информацией для всех остальных, кто просит решения.

Это работает для меня:

NSDictionary *headersDict = @{@"Content-Length": [NSString stringWithFormat:@"%@", mySize], @"Content-Type": @"video/mp4", @"Accept": @"application/json", @"Authorization": [NSString stringWithFormat:@"Basic %@", hash]}; 

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:urlToPut]; 
[request setHTTPMethod:@"PUT"]; 
[request setHTTPBody:videoData]; 
[request setAllHTTPHeaderFields:headersDict]; 

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
    // if everything run great, we have to invalidate timer to notify 
    [uploadTimer invalidate]; 

} 
failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"error: %@", error); 
}]; 

// start timer where app will be checking upload progres on the server 
uploadTimer = [NSTimer scheduledTimerWithTimeInterval:.1 
             target:self 
             selector:@selector(checkUploadProgressForRecord:) 
             userInfo:record 
             repeats:YES]; 

[operation start]; 

Кто-нибудь имеет другое решение?

ответ

0

Вы подход имеет следующие вопросы:

  1. Метод PUT не предложенный метод для загрузки файла. PUT может использоваться, но для этого требуется, чтобы сервер ДОЛЖЕН создать ресурс на указанном указанном URI. Однако в большинстве случаев сервер будет создавать новый URI (который неизвестен клиенту) при сохранении загруженного файла локально на сервере. В этом случае должен использоваться метод POST.

  2. Вы используете объект NSData, который представляет содержимое файла и присваивает ему запрос setHTTPBody. Это проблематично в отношении системной памяти, когда файл большой, а объект NSData использует буфер, выделенный для кучи, для хранения содержимого файла. Вы должны либо использовать объект NSData, который использует файл с отображением памяти, либо NSStream для представления содержимого файла.

  3. Вы слишком расплывчатые о заголовках запроса:

    `[request setAllHTTPHeaderFields:headersDict];` 
    

    заголовок запроса имеет важное значение. Вы должны установить Content-Type и возможно заголовок Content-Length.

Для «загрузки файлов на основе форм» см. Также RFC 1867.

+0

Благодарю вас за советы. Но API установлен, что я должен использовать PUT-запрос для загрузки видеоданных. Мой заголовок: 'NSDictionary * headersDict = @ {@" Content-Length ": [NSString stringWithFormat: @"% @ ", mySize], @" Content-Type ": @" video/mp4 ", @" Accept ": @ "application/json", @ "Authorization": [NSString stringWithFormat: @ "Basic% @", hash]}; ' – petesalt

+0

@petesalt Заголовки выглядят отлично. Измените свой пост и включите заголовки. – CouchDeveloper

+0

сейчас я редактировал свой вопрос с заголовками. – petesalt

Смежные вопросы