我正在尝试使用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)”。
任何帮助表示赞赏!我很难过。
答案 0 :(得分:1)
来自 - [NSURLSession uploadTaskWithStreamedRequest:]的文档(看起来就像你正在使用的那样):
...此请求对象中的正文流和正文数据 被忽略,NSURLSession调用它的委托 URLSession:task:needNewBodyStream:提供正文数据的方法。
您是否实施了该委托方法?