服务器不从NSURLSessionUploadTask接收数据

时间:2014-06-27 16:03:41

标签: ios django afnetworking multipartform-data 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。我不确定的一件事是,根据AFNetworkingActivityLogger输出,请求的主体是“(null)”。

任何帮助表示赞赏!我很难过。

1 个答案:

答案 0 :(得分: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