我想通過AFNetworking使用NSURLSessionUploadTask通過多部分請求上傳文件。該請求執行並接收來自服務器的響應,但服務器未接收到表單中的數據。服務器沒有收到來自NSURLSessionUploadTask的數據
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')
但是這兩個文件和POST對象是空的:
FILES: <MultiValueDict: {}> | DATA: <QueryDict: {}>
此作品,未經多請求 - 只發送不帶文件POST請求上傳的QueryDict填充。我不確定的一件事是根據AFNetworkingActivityLogger輸出,請求的主體是「(null)」。
任何幫助表示讚賞!我很難過。
Ack-RTFM在我的部分失敗 - 這的確是問題所在。事實證明,無論如何我需要支持iOS6,所以我最終無法使用NSURLSession,但這是解決我的問題的方法。感謝您指出了這一點! – riemannnoodles