Сервер не получает данные от NSURLSessionUploadTask

Я пытаюсь загрузить файл через составной запрос, используя NSURLSessionUploadTask через AFNetworking. Запрос выполняется и получает ответ от сервера, но сервер не получает данные в форме.

iOS-код

NSString *urlString = [[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString];
NSError *error = nil;

NSMutableURLRequest *request = [self.requestSerializer multipartFormRequestWithMethod:@"POST" URLString:urlString parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    //
   [formData appendPartWithFileData:[NSData dataWithContentsOfURL:[NSURL fileURLWithPath:path]]
                               name:@"video"
                           fileName:[path lastPathComponent]
                           mimeType:@"video/mp4"];
} error:&error];

if ([account isAuthenticated]) {;
    NSString *authHeader = [NSString stringWithFormat:@"Bearer %@", account.accessToken];
    [request setAllHTTPHeaderFields:@{@"Authorization": authHeader}];
}

NSURLSessionUploadTask *task = [self uploadTaskWithStreamedRequest:request progress:progress completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
    if (error) {

    } else {

    }
}];
[task resume];

Вот информация заголовка для запроса от AFNetworkingActivityLogger:

POST 'http://127.0.0.1:8000/upload/': {
"Accept-Language" = "en;q=1, fr;q=0.9, de;q=0.8, zh-Hans;q=0.7, zh-Hant;q=0.6, ja;q=0.5";
Authorization = "Bearer 270f985de7ebf0aa49b7ff1cad8377e007141f94";
"Content-Length" = 225974;
"Content-Type" = "multipart/form-data; boundary=Boundary+4597B504492E1006";
"User-Agent" = "Test/1.0 (iPad Simulator; iOS 7.1; Scale/1.00)";
} (null)

Я использую Django на стороне сервера. Вот тестовый вид:

class UploadView(View):

def post(self, request, *args, **kwargs):
    logger.debug("FILES: {0} | DATA: {1}".format(request.FILES, request.POST))
    return HttpResponse(content=json.dumps({"test": "2"}), content_type='application/json')

Но оба объекта FILES и POST пусты:

FILES: <MultiValueDict: {}> | DATA: <QueryDict: {}>

Это работает без составного запроса - просто отправив запрос POST без загрузки файла, заполняется QueryDict. Одна вещь, в которой я не уверен, заключается в том, что тело запроса является «(null)» в соответствии с выходными данными AFNetworkingActivityLogger.

Любая помощь приветствуется! Я в тупике.


person riemannnoodles    schedule 27.06.2014    source источник


Ответы (1)


Из документов для -[NSURLSession uploadTaskWithStreamedRequest:] (похоже, это то, что вы используете):

... Поток тела и данные тела в этом объекте запроса игнорируются, и NSURLSession вызывает метод URLSession:task:needNewBodyStream: своего делегата для предоставления данных тела.

Вы реализовали этот метод делегата?

https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLSession_class/Introduction/Introduction.html#//apple_ref/doc/uid/TP40013435-CH1-SW28

person Isak    schedule 29.07.2014
comment
Ack- RTFM не работает с моей стороны - это действительно была проблема. Оказалось, что мне все равно нужно было поддерживать iOS6, поэтому в конечном итоге я не смог использовать NSURLSession, но это решило бы мою проблему. Спасибо за указание на это! - person riemannnoodles; 12.08.2014